Подстановка переменной быстрее, чем целое число в строке в Vic-20 basic? - PullRequest
3 голосов
/ 25 августа 2010

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

Программа 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

Ответы [ 3 ]

2 голосов
/ 25 августа 2010

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

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

2 голосов
/ 25 августа 2010

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

Раньше мне нравился этот журнал. Это на самом деле говорит 30% улучшение. Посмотрите на то, что происходит в программе 2, и это станет ясно, потому что вы много зацикливаетесь, используя переменные, программа делает все выделение памяти заранее для вычисления адресов памяти. При более медленном подходе каждая итерация должна выделить память для выделенного ниже как часть вычисления адреса памяти:

POKE 7680 + A, 81: POKE 38400 + A

Это характер BASIC-переводчика в VIC.

0 голосов
/ 02 октября 2010

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

...