(С) Мучкаев Максим
г. Самара, 1996
Оценка быстродействия программ
Дано: две процедуры на ассемблере, написанные по разным алгоритмам, но
выполняющие одно и то же действие (например, обычная "бегущая строка").
Найти: какая из двух процедур выполняется быстрее? То есть, на выполнение
какой из процедур уходит меньше тактов процессора?
Если процедура по своим размерам невелика (до 100 ассемблерных команд), то
эту задачу можно решить, используя таблицу из книги ИНФОРКОМА "ПРОГРАММИРОВАНИЕ
В МАШИННЫХ КОДАХ И НА ЯЗЫКЕ АССЕМБЛЕРА", где кроме кодов команд, приведено еще
и число тактов, приходящееся на команду.
Для примера мы рассмотрим программу "бегущей строки". В такой программе
кроме большой длинны, есть еще и множество циклов, что затрудняет подсчет числа
тактов вручную.
В принципе, можно подсчитать не точное, а примерное число тактов, занимаемое
вашей программой. Можно применять всякие хитрые способы, но все это сложно!
А вот простой и доступный всем способ оценки времени выполнения программы:
ORG 30000
EI
LOOP LD A,1 ; Выдаем на BORDER 1 (синий).
OUT (#FE),A ;
CALL SCROLL ; Вызываем измеряемую программу.
XOR A ; Выдаем на BORDER 0
OUT (#FE),A
HALT ; Ожидаем до поступления прерывания.
LD A,(23560); Если нажат SPACE - выход,
CP 32
JR NZ,LOOP ; Если не нажат - повтор с метки LOOP.
RET
Итак, вы пишите на ассемблере эту программу и запускаете ее. Эта программа
циклически вызывает некую процедуру SCROLL, время работы которой мы хотим
измерить. До вызова процедуры на бордюр выдается синий цвет, а после завершения
процедуры - черный цвет. Таким образом, на бордюре мы получаем две полосы -
синюю и черную.
Так вот, чем больше синего цвета на экране, тем больше (в тактах) занимает
вызываемая программа. ВНИМАНИЕ! Команда HALT должна стоять один раз, сразу
после второго OUT (#FE),A. В вызываемой процедуре этой команды быть не должно!
Если программа работает очень быстро - вы увидите черный бордюр и редко
проскакивающие синие штрихи. Для программ от 1000 до 66-69 тыс. тактов вы
увидите бордюр заполненный, в той или иной мере, синим цветом. Если бордюр
полностью синий, значит ваша процедура "поедает" почти все такты процессора
между прерываниями. Ну, а если бордюр отчаянно замигает синим цветом - вы вышли
за пределы одного прерывания, и значит ваша программа "весит" более чем 72 тыс.
тактов.
Как вы наверное уже поняли, этим способом можно мерить число тактов не
только одной процедуры, но и нескольких процедур сразу! Это может быть полезно
при создании программ, активно работающих с экраном. Для того, чтобы такие
программы не "тормозили" и не "глючили", они должны умещаться в числе тактов
между двумя прерываниями, а это число для каждой машины разное (у моего
"PENTAGON'а" - 72194 тактов, а у друзей на "SCORPION'ах" - около 69 тыс.тактов).
Ну, а самое интересное еще впереди! Теперь вы сможете оценить распределение
процессорного времени между подпрограммами. Вот конкретный пример на базе
текста одной из типичных в наше время "музыкалок":
ORG 30000
EI
LOOP LD A,1 ; Выдали на бордюр синий цвет.
OUT (#FE),A
CALL SCROLL ; Вызвали SCROLL.
LD A,2 ; Выдали на бордюр красный цвет.
OUT (#FE),A
CALL ANALIZATOR ; Вызвали ANALIZATOR.
LD A,3 ; и т.д.
OUT (#FE),A
CALL MAIN_EFFECT
LD A,4
OUT (#FE),A
CALL SONG
XOR A
OUT (#FE),A
HALT
LD A,(23560)
CP 32
JR NZ,LOOP
RET
В результате работы такой "музыкалки", на бордюр будут выдаваться 5
разноцветных полосок. По размерам первых четырех вы сможете судить о числе
тактов, "съеденных" каждой из вызываемых процедур, а по размерам последней
(черной) полосы можно определить сколько процессорного времени еще осталось!
Надеюсь, что я не окончательно вас запутал! Так вот, теперь опубликованные в
ZX-РЕВЮ 95/6 на стр. 43-44 советы по ускорению программ, будут для вас не
пустым звуком. Попробуйте, в соответствии с этими советами, ускорить какую либо
процедуру, а затем проведите "контрольный замер" и убедитесь в результатах
своей работы.