ZXNet эхоконференция «code.zx» 
тема: И ещё, 
 
от: Valery Grigoriev 
кому: All 
дата: 02 Dec 2005
 
Hello, GriV 
 
даже 10 прямых вызовов через Call может уже привести к выигрышу по сравнению с  
системой Call на Jp. 
 
А если их много? А если их очень много? 
 
И вообще, ещё раз - сам процесс "пропатчивания" по сравнению с временем  
загрузки программы (которое обязон есть) - порядка 5-10% (для средних  
исполнительных файлов - для игр и дем эта цифра будет значительно меньше) -  
т.е. вы загрузили программу, у вас ещё флопарь не перестал крутиться а  
программа уже настроена - остались только прямые Call и никакой таблица в  
памяти уже нет - чистейшая программа. 
 
После этого ВСЕ функции выполняются быстро - потому что нет никаких  
дополнительных переходов и т.д. 
 
Т.о. своя оценка (плюсом обозначаю достоинства минусом недостатки): 
 
1. RST - слишком медленно(-) хотя может показаться удобным(+) - на каждый вызов 
требуется порядка 200(-) тактов (может и чуть быстрей) на определения куда  
прошёл вызов; может возвратиться с ошибкой(+) - если нет заданной функции.  
Использовался в старых программах как наследие системы прерываний от PC-шных  
монстров. Требуется меньше всего памяти для вызова(+) - около 3х байт,  
позволяет растаскивать процедуры по ПЗУ как угодно, внутренний транслятор  
адресов сам всё вычислит и сделает(+). 
 
2. Метод установленных точек перехода - Jp (Call) на таблицу Jp внутри ПЗУ -  
требуется порядка 5-6 байт из программы (-), но работает очень быстро(+) по  
сравнению с предыдущим вариантом. Тратится условно 20/26 тактов на один вызов  
процедуры. Передача параметров (загрузка регистров) требует дополнительных(-)  
вложений (где-то до 50 тактов максимум), от компилятора требуется  
согласованность с версией ПЗУ (-), потому что прямой вызов/перезод на ПЗУ может 
привести к фатальному исходу(?-), практически невозможно контролировать  
"неправильные" вызовы/переходы(-). Требуется дополнительная таблица в ПЗУ(-). 
 
3. Метод прямого вызова с предварительной настройкой. Подразумевает наличие в  
файле таблиц для коррекции адресов вызовов(-) - что требует дополнительного  
места на носителе (4 байта на каждую точку). Требует предварительной настройки  
(-), порядка 100 тактов на одну точку вызова, однако настройка идёт только один 
раз(?+), больше она не выполняется. Требует 5-6 байт для своей работы(-).  
Скорость выполнения вызова самая высокая(+) - быстрей просто не бывает - 10/16  
тактов. Загрузка регистров параметрам увеличивает(-) время вызова и память  
отводимую для вызова условно до 40 тактов. Имеется возможность отследить  
неверный вызов(+) ещё на этапе настройки вызовов - контролируются "неправильные 
переходы". Требуется дополнительная таблица в ПЗУ(-). 
 
Я для себя выбрал третий вариант, а Вы? ;) 
 
от: Valery Grigoriev 
кому: All 
дата: 21 Aug 2006
 
Hello, GriV 
 
мне не совсем понятно зачем нужна длительность выполнения операторов басика.  
Может быть сравнивать производительность разных басик-трансляторов? 
Скорей всего точную информацию по времени работы операторов ты нигде не найдёшь 
- просто потому что это никому не надо. 
 
 |