Frame Angle on a 386 Angle on a pentium
1 0 0
2 3 1
3 6 2
4 9 3
5 - 4
6 - 5
7 - 6
8 - 7
9 - 8
10 - 9Пень выдает , допустим , 10 fps , в то время как 386-я только 4 .
Другой путь : создать прерывание , которое будет упдатить переменные по 70 раз в секунду .
У пентиума быстрый математический сопроцессор , и это можно использовать .
Пень имеет 2 конвейера - основной U и второй - V , который может исполнять лишь некоторые команды , например mov , add , lea . Одновременное использование обоих конвейеров есть фича :
Пример .
В следующем примере оптимизируем прорисовку линии . Условные обозначения :
; Clocks Pipe Pairing Comment
@@inner:
lea edi,[edx+edx*4] ; 1 U UV edi=edx*5
mov bl,ah ; 0 V UV ebx=ax/256
shl edi,6 ; 1 U NU edi*=64
add edi,ebx ; 1 U UV edi+=ebx
add edi,0a0000h ; 0 U UV edi+=screenstart
mov [edi],b 10d ; 1? U UV [edi]=10
add edx,[yp] ; 0? V UV edx+=[yp]
add eax,[xp] ; 1? U UV eax+=[xp]
dec ecx ; 0 U UV ecx-=1
jnz short @@inner ; 1 V NV jump if not zero
; 6?Буфер видеопамяти мы помещаем в edi. Мы меняем 'add edi,ebx' на 'mov [edi+ebx+0a0000h],b 10d'.
@@inner:
lea edi,[edx+edx*4] ; 1 U UV edi=edx*5
mov bl,ah ; 0 V UV ebx=ax/256
shl edi,6 ; 1 U NU edi*=64
add edx,[yp] ; 0? V UV edx+=[yp]
mov [edi+ebx+0a0000h],b 10d ; 1? U UV []=10
add eax,[xp] ; 0? V UV eax+=[xp]
dec ecx ; 1 U UV ecx-=1
jnz short @@inner ; 0 V NV jump
; 4?Разница в скорости заметна , хотя код становится мене читабельным .
@@inner:
mov bl,ah ; 1 U UV ebx=ax/256
add eax,[xp] ; 0? V UV eax+=[xp]
mov [edi+ebx],b 10d ; 1? U UV []=10
add edi,[yp] ; 0? V UV edi+=[yp]
dec cx ; 1 U UV cx-=1
jnz @@inner ; 0 V NV jump if not zero
; 3?Кэш также влияет на скорость . Кэш может быть первого уровня и второго . Если процессор не находит данных в кэше 1-го уровня , он может искать их во втором или вообще в внешней памяти - а это уже 10 тактов . Память может быть обычной , едошной и вообще бог знает какой , так что не все зависит от кода ...
Существуют различные трюки для ускорения . Если внутри какого-то цикла используются перемнные , желательно , чтобы в памяти они находились рядом , в диапазоне 32 байт . Ибо пень обменивает данные между кэшем и памятью блоками именно по 32 байта .