2010-08-25 1 views
3

Следующие две (функционально эквивалентные) программы берутся из старой версии бюллетеня Compute's Gazette. Основное различие заключается в том, что программа 1 помещает целевые базовые ячейки памяти (7680 и 38400) в линию, тогда как программа 2 сначала назначает их переменной.Переменная замещение быстрее, чем целое число в Vic-20 basic?

Программа 1 работает на 50% медленнее, чем программа 2. Почему? Я бы подумал, что добавление дополнительной переменной добавит время, а не вычитает его!

10 PRINT"[CLR]":A=0:TI$="000000" 
20 POKE 7680+A,81:POKE 38400+A,6:IF A=505 THEN GOTO 40 
30 A=A+1:GOTO 20 
40 PRINT TI/60:END 

Программа 1

10 PRINT "[CLR]":A=0:B=7600:C=38400:TI$="000000" 
20 POKE B+A,81:POKE C+A,6:IF A=505 THEN GOTO 40 
30 A=A+1:GOTO 20 
40 PRINT TI/60:END 

Программа 2

ответ

2

Причина в том, что BASIC полностью интерпретируется здесь, поэтому строки «7680» и «38400» необходимо преобразовать в двоичные целые числа. КАЖДОЕ ВРЕМЯ линия 20 достигнута (506 раз в этой программе). В программе 2 они конвертируются один раз и сохраняются в B. Таким образом, пока поиск по-и-выборке из B быстрее, чем преобразование-строка-в-двоичный, программа 2 будет быстрее.

Если бы вы использовали компилятор BASIC (не уверены, существует ли для VIC-20, но это будет классный проект ретро-программирования), то программы, вероятно, будут иметь одинаковую скорость или, возможно, 1 может быть немного быстрее, в зависимости от того, какие оптимизаторы сделал компилятор.

2

Это со страницы 76 данного вопроса: http://www.scribd.com/doc/33728028/Compute-Gazette-Issue-01-1983-Jul

Я любил этот журнал. Фактически это говорит о 30% -ном улучшении. Посмотрите, что происходит в программе 2, и становится ясно, потому что вы много перебираете с помощью переменных, которые программа выполняет все распределение памяти заранее для вычисления адресов памяти. Когда вы делаете медленный подход каждой итерации должен выделить память для выделенной ниже как часть вычисления из адреса памяти:

POKE + A, 81: POKE + А

Это просто характер БАЗИСНОГО переводчика на ВМЦ.

0

Доступ к первой заданной переменной будет быстрым; второй будет немного медленнее и т. д. Разбор многозначных констант требует, чтобы интерпретатор выполнял повторное умножение на десять. Я не знаю, какие точные компромиссы между переменными и константами, но короткие имена переменных используют меньше места, чем многозначные константы. Между прочим, постоянный нуль может быть проанализирован быстрее, если он записан как единая десятичная точка (без цифр), чем записанная цифрой нуль.

+0

Вы имеете в виду интерпретатор, а не компилятор. :) – Almo