Показать сообщение отдельно
Старый 01.01.2006, 22:46   #12
AsmLover
 
Сообщений: n/a
Originally posted by SubZer0@Sep 22 2005, 10:01 PM
у мя на Athlon XP Pro3+ работает где деление на два у мя быстрей деление работает, а вот такой код
time1=MilliSecs()
For i=1 To 1000000
 a=i/10
Next
time1=MilliSecs()-time1
time2=MilliSecs()
For i=1 To 1000000
 a=i*.1
Next
time2=MilliSecs()-time2
Print " [/2] "+time1
Print " [*.5] "+time2
WaitKey()
то результат обычно 42 и 14

вот такой код
time1=MilliSecs()
For i=1 To 1000000
 a=i/5
Next
time1=MilliSecs()-time1
time2=MilliSecs()
For i=1 To 1000000
 a=i*.2
Next
time2=MilliSecs()-time2
Print " [/2] "+time1
Print " [*.5] "+time2
WaitKey()
работает 46 и 15


умножение рулит! :rolleyes:
Рулит не умножение, а знание алгоритмов, по которым работает транслятор/компилятор конкретного языка (вернее, конкретной реализации). Например, операции целочисленного деления или умножения могут выполняться заменой на операции сдвига и суммирования, то есть

x / 2 = x shl 2

x / 5 = 10 * x / 2 = ((x shr 3)+(x shr 1)) shl 2

и т.д.

Blitz3D из вышеперечисленного оптимизирует только деление на два.
Поэтому, заменив в примере из предыдущегого поста x / 5 на вышеприведенную формулу, умножение больше не рулит:
time1=MilliSecs()
For i=1 To 1000000
a=((i Shr 3) + (i Shr 1)) Shl 2
;a=i / 5
Next
time1=MilliSecs()-time1
time2=MilliSecs()
For i=1 To 1000000
a=i * .2
Next
time2=MilliSecs()-time2
Print " [/2] "+time1
Print " [*.5] "+time2
WaitKey()


А для разработчиков Blitza было бы лучше вообще перейти на арифметику с фиксированной точкой, (даже тип double не спасет за счет относительно низкой скорости). Тем более сейчас уже наступила эра 64-битных процессоров.
Хотя Марку все равно респект и уважение.
 
Ответить с цитированием