Показать сообщение отдельно
Старый 01.01.2006, 23:32   #26
AsmLover
 
Сообщений: n/a
Originally posted by impersonalis@Nov 13 2005, 02:42 AM
Вот провёл тестик: что быстрее - цикл или переход по GoTo
ITER=1000000
;====
time1=MilliSecs()
i=ITER
.a
i=i-1
If i>0 Goto a
time1=MilliSecs()-time1
;===
time2=MilliSecs()
For i=ITER To 1 Step -1
Next
time2=MilliSecs()-time2
;===
Print "Goto "+time1
Print "for "+time2
WaitKey()
End
Интересно - попробуйте.
Сравнение некорректное. Использование в цикле For...Next шага Step требует от компилятора дополнительного считывания из памяти переменной, эквивалентной Step. Да и число циклов нужно хотя бы на порядок увеличить.

ITER=10000000
;====
time1=MilliSecs()
i=1
.a
i=i+1
If i<ITER Goto a
time1=MilliSecs()-time1
;===
time2=MilliSecs()
For i=1 To ITER
Next
time2=MilliSecs()-time2
;===
Print "Goto "+time1
Print "for "+time2
WaitKey()
End
Teперь цикл с GOTO выполняется медленнее. (За счет того, что в итоговом ассемблерном коде в цикле For...Next используется константа и прямой инкремент регистра).

P.S. На ассемблере часто вместо прямого перехода jmp addr используется связка типа push .... ret.

Гораздо полезнее посмотреть, насколько медленнее происходит обращение к глобальным переменным, объявив ITER как GLOBAL.....