Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.14;
Скачать: CL | DM;

Вниз

Обратить байт - соревнование :)   Найти похожие ветки 

 
Igorek ©   (2005-07-23 09:59) [0]

Исходные данные: байт.
Требуется: переставить биты (младшие биты становятся старшими и наоборот).
Исполнение: процедура, принимающая байт и возвращающая обращенный байт.
Оценивание по двум номинациям:
1) скорость работы
2) обьем дополнительной памяти
Призы: всеобщее уважение и чувство выполненого долга

приветствуются спонсоры.. :)


 
Kerk ©   (2005-07-23 10:07) [1]

что-то такое

 mov cl,8
 xor al,al
@@:
 rcr ah
 rcl al
 dec cl
 jmp @b


 
Kerk ©   (2005-07-23 10:12) [2]

так лучше:

 xor ah,ah
@@:
 rcr al,1
 rcl ah,1
 test al,al
 jnz @b
 mov al,ah

на входе в al - исходный байт
на выходе в al - перевернутый байт

если что не судите строго - не проснулся истчо :)


 
Kerk ©   (2005-07-23 10:12) [3]

а. ну и clc в начале забыл блин.


 
Kerk ©   (2005-07-23 10:16) [4]

конечная версия:
SwapIt proc
 clc
 xor ah,ah
@@:
 rcr al,1
 rcl ah,1
 test al,al
 jnz @b
 mov al,ah
 ret
SwapIt endp


 
3DxFantastika ©   (2005-07-23 10:42) [5]

Если байт уже представлен в строковом виде, например 11100001 то функция будет:
Function mySYSswap(st:string):string;
 Var i:integer;
Begin
Result:="";
   if length(st)<>8 then exit; //ошиблись на входе?  .. выходим
For i:=8 DownTo 1 do Result:=Result+st[i]; // :)
End;

Пример использования:
Edit2.Text:= mySYSswap(Edit1.Text);

Для получения представления байта в строковом виде может быть использована функция:

function IntToBin(Value: integer; Digits: integer): string;
var
i: integer; p:string;
begin
p:= "";
for i := 0 to Digits - 1 do
 if Value and (1 shl i) > 0 then
  p:= "1" +p
 else
  p := "0" + p;
  IntToBin:=p;
end;


пример её использования:

-----
For simvol:=1 to length(st) do
  Begin
s_result:=s_result+IntToBin(Ord(st[simvol]),8)+" ";
  End;
-----


 
Kerk ©   (2005-07-23 10:44) [6]

3DxFantastika ©   (23.07.05 10:42) [5]

Девушка, Вы определенно зря пропустили нашу ветку про изврашения. Многому можете нас научить.


 
Alx2 ©   (2005-07-23 10:50) [7]

>Kerk ©   (23.07.05 10:44) [6]
Экстремальный случай, когда все искомые значения просто сидят в таблице, не рассматриваем? :)


 
Kerk ©   (2005-07-23 10:53) [8]

Alx2 ©   (23.07.05 10:50) [7]

Ну почему же? Вроде самый быстрый способ. Но памяти жрет больше всего.


 
Verg ©   (2005-07-23 10:53) [9]

1. Табличный. no comments...

2.
unsigned char swapbits(unsigned char n)
{
  n = ((n >>  1) & 0x55) | ((n <<  1) & 0xaa);
  n = ((n >>  2) & 0x33) | ((n <<  2) & 0xcc);
  n = ((n >>  4) & 0x0f) | ((n <<  4) & 0xf0);
  return n;
}

3. 64-бит умножение
 a) n = (n * 0x0202020202ULL & 0x010884422010ULL) % 1023;
 b) n = ((n * 0x80200802ULL) & 0x0884422110ULL) * 0x0101010101ULL >> 32;

4. Просто умножение
n = ((n * 0x0802LU & 0x22110LU) | (n * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16


 
Alx2 ©   (2005-07-23 10:55) [10]

Эх, не успел :)
Тоже хотел номер 2 из поста [9] привести.


 
Kerk ©   (2005-07-23 11:02) [11]

блинн.... ну ужос... все.. последний вариант.. обещаю :)
SwapIt proc
clc
xor ah,ah
mov cl,8
@@:
rcr al,1
rcl ah,1
dec cl
jnz @b
mov al,ah
ret
SwapIt endp


 
Verg ©   (2005-07-23 11:04) [12]


> Kerk ©   (23.07.05 11:02) [11]



> все.. последний вариант.. обещаю


Эт вряд ли....


 
Alx2 ©   (2005-07-23 11:20) [13]

Реализация 2-го варианта поста [9] на asm.

function SwapBits(_byte:Byte):Byte;
asm
       movzx     ecx, al
       lea       edx, [ecx+ecx]
       and       edx, $AA
       shr       ecx, 1
       and       ecx, $55
       or        ecx, edx
       mov       eax, ecx
       shr       eax, 2
       and       eax, $33
       shl       ecx, 2
       and       ecx, $CC
       or        eax, ecx
       mov       edx, eax
       shr       edx, 4
       and       edx, $F
       shl       eax, 4
       and       eax, $F0
       or        edx, eax
       movzx     eax, dl
end;


 
Alx2 ©   (2005-07-23 11:21) [14]

Заголовок поправлю:
function SwapBits(_byte:Byte):Byte; register;


 
raidan ©   (2005-07-23 11:26) [15]

>Kerk ©   (23.07.05 10:44) [6]
>3DxFantastika ©   (23.07.05 10:42) [5]

>Девушка, Вы определенно зря пропустили нашу ветку про >изврашения. Многому можете нас научить.

Ты зачем так жестоко? :)


 
Alx2 ©   (2005-07-23 11:36) [16]

Две лишних команды выкинул:

function SwapBits(_byte:Byte):Byte; register;
asm
       movzx     ecx, al
       lea       edx, [ecx+ecx]
       and       edx, $AA
       shr       ecx, 1
       and       ecx, $55
       or        ecx, edx
       mov       eax, ecx
       shr       eax, 2
       and       eax, $33
       shl       ecx, 2
       and       ecx, $CC
       or        eax, ecx
       mov       edx, eax
       shr       edx, 4
       shl       eax, 4
       or        edx, eax
       movzx     eax, dl
end;


 
Alx2 ©   (2005-07-23 11:50) [17]

Посмотрел особенности кода, генерируемого Delphi после возврата из функций типа byte и выкинул еще одну команду:


function SwapBits(_byte:Byte):Byte; register;
asm
       movzx     ecx, al
       lea       edx, [ecx+ecx]
       and       edx, $AA
       shr       ecx, 1
       and       ecx, $55
       or        ecx, edx
       mov       eax, ecx
       shr       eax, 2
       and       eax, $33
       shl       ecx, 2
       and       ecx, $CC
       or        eax, ecx
       mov       edx, eax
       shr       edx, 4
       shl       eax, 4
       or        eax, edx
end;


 
begin...end ©   (2005-07-23 11:52) [18]

> Alx2 ©   (23.07.05 11:21) [14]
> Заголовок поправлю: ...

Зачем?


 
Alx2 ©   (2005-07-23 11:55) [19]

>begin...end ©   (23.07.05 11:52) [18]

Ну, паранойя у меня :)

Особенно обострилась после разговора с тобой о передаче со спецификатором const :)


 
Sha ©   (2005-07-23 12:00) [20]

На работе много разных вариантов, написанных посетителями delphimaster. В понедельник поищу.

Помню, одно из самых красивых, достаточно быстрых и коротких (25 байт) решений было что-то вроде этого (идея заимствована):


function ReverseBits(b: byte): byte;
asm
    test al, 81h
    jp   @1
    xor  al, 81h
@1:
    test al, 42h
    jp   @2
    xor  al, 42h
@2:
    test al, 24h
    jp   @3
    xor  al, 24h
@3:
    test al, 18h
    jp   @4
    xor  al, 18h
@4:
end;


 
Sha ©   (2005-07-23 12:04) [21]

> Alx2 ©   (23.07.05 11:50) [17]

У меня было похожее решение, но если не ошибаюсь, обошелся то ли тремя, то ли двумя сдвигами :)


 
Sha ©   (2005-07-23 12:09) [22]

> 3DxFantastika ©   (23.07.05 10:42) [5]

Мы тут пишем функцию:

function ReverseBits(b: byte): byte;

Хотите поучаствовать?

> Kerk ©   (23.07.05 10:44) [6]

С девушками повежливей надо.


 
Alx2 ©   (2005-07-23 12:10) [23]

>Sha ©   (23.07.05 12:04) [21]

Помню что-то такое.
А я, собственно, только "перекомпилировал" вручную и какое-то ощущение незавершенности присутствует...

PS
[20] - класс!!!


 
ssk ©   (2005-07-23 12:20) [24]

снова меряемся пиписками? :-D


 
Alx2 ©   (2005-07-23 12:22) [25]

>ssk ©   (23.07.05 12:20) [24]

"С какой целью интересуетесь?" (с)

:))


 
Anatoly Podgoretsky ©   (2005-07-23 13:48) [26]

raidan ©   (23.07.05 11:26) [15]
Вот сделает ему Анка реверс в изврашеной форме, тогдп посмотрим как он заговорит.


 
Alx2 ©   (2005-07-23 18:59) [27]

>Sha ©   (23.07.05 12:04)
После рисования на бумажке получилось с тремя сдвигами:

 function SwapBits(_byte: Byte): Byte; register;
 asm
       mov     ah,al
       mov     ecx,eax
       and     eax,$330
       and     ecx,$CC0
       shr     ecx,2
       lea     eax,[4*eax+ecx]
       mov     ecx,eax
       and     eax,$550
       and     ecx,$AA0
       shr     eax,3
       shr     ecx,5
       or      eax,ecx
 end;


 
Kerk ©   (2005-07-23 19:07) [28]

Anatoly Podgoretsky ©   (23.07.05 13:48) [26]

Думаете понравится?


 
Alx2 ©   (2005-07-23 19:18) [29]

Вдогонку [27]:
Торможу. Забыл провести то же самое с другой парой сдвигов.

 function SwapBits(_byte: Byte): Byte; register;
 asm
       mov     ah,al
       mov     ecx,eax
       and     eax,$330
       and     ecx,$CC0
       shr     ecx,2
       lea     eax,[4*eax+ecx]
       mov     ecx,eax
       and     eax,$550
       and     ecx,$AA0
       lea     eax,[4*eax+ecx]
       shr     eax,5
 end;


Итого, два явных сдвига.


 
KilkennyCat ©   (2005-07-23 21:11) [30]


> Итого, два явных сдвига.


где? ;)


 
Alx2 ©   (2005-07-23 21:12) [31]

>KilkennyCat ©   (23.07.05 21:11) [30]

У меня, наверное :)


 
Sha ©   (2005-07-23 22:16) [32]

>Alx2 ©   (23.07.05 19:18) [29]

На одну команду больше, но на 1 сдвиг меньше и поэтому, думаю, быстрее:


function ReverseBitsSha1Shift(b: byte): byte;
asm
 mov  edx, eax         //........76543210
 and  eax, $00AA       //........7.5.3.1.
 and  edx, $0055       //.........6.4.2.0
 lea  eax, [4*edx+eax] //.......67452301.
 lea  edx, [eax+eax]   //......67452301..
 and  eax, $0198       //.......67..23...
 and  edx, $00CC       //........45..01..
 lea  eax, [8*edx+eax] //.....45670123...
 lea  edx, [eax+eax]   //....45670123....
 shr  eax, 7           //............4567
 and  edx, $00F0       //........0123....
 add  eax, edx         //........01234567
end;


 
ssk ©   (2005-07-24 17:41) [33]

>>Alx2 ©   (23.07.05 12:22) [25]
С какой целью интересуетесь?


уж больно частенько такого рода "конкурсы" стали здесь появляться ;-)


 
Knight ©   (2005-07-24 18:48) [34]

Вот блин... тему прочитал, идею замутил, а оно уже в [20] выложено :(


 
Knight ©   (2005-07-24 18:50) [35]

Ладно... хоть асм по ходу написания немного вспомнил :)


 
Alx2 ©   (2005-07-25 08:20) [36]

Результаты замеров (профайлер VTune 7.0).

Мнемоника названия метода: m_<автор>_<номер поста>
Тест:

Const
 Count = 1000000;
Var
 k: Cardinal;
 b: Byte;
Begin
 For k := 1 To Count Do
   For b := 0 To $FF Do
     m_Sha_20(b);

 For k := 1 To Count Do
   For b := 0 To $FF Do
     m_Alx2_29(b);

 For k := 1 To Count Do
   For b := 0 To $FF Do
     m_Sha_32(b);

 For k := 1 To Count Do
   For b := 0 To $FF Do
     m_Kerk_11(b);
End;


Результаты

Size Function Clockticks Samples
41 m_Alx2_29 1193
45 m_Sha_32 1602
25 m_Sha_20 4797
16 m_Kerk_11 6928


 
Kerk ©   (2005-07-25 09:21) [37]

ssk ©   (23.07.05 12:20) [24]
снова меряемся пиписками? :-D


Alx2 ©   (25.07.05 8:20) [36]

Size Function Clockticks Samples
41 m_Alx2_29 1193
45 m_Sha_32 1602
25 m_Sha_20 4797
16 m_Kerk_11 6928


Во! У меня самая длинная :D


 
Sha ©   (2005-07-25 10:11) [38]

> Alx2 ©   (25.07.05 08:20) [36]
> Результаты замеров (профайлер VTune 7.0).

Кто ж им мерит? Им профилировать надо. А в попугаях я длиннее :)

Результаты в тиках CPU на моем рабочем P4:
000  Dummy
000  ReverseBitsSha0
008  ReverseBitsSha3
012  nikkie
012  nikkie2
012  nikkie_tbl
012  ReverseBitsSha1
012  ReverseBitsSha5
012  SwapBitsAlx2
016  BitSwapPierre
016  ReverseBitsSha2
016  ReverseBitsSha6
016  SwapBits2
020  Default2
020  ReverseBitsSha4
024  Achtung
024  CombSwapAsm
028  CombSwap
040  SwapBits_Verg
084  SwapBitsKerk
096  Default
168  SwapBits_APP
176  Guav
208  ReverseBits
216  Jack128


Далее функции в порядке поступления:
function Default(B: Byte): Byte;
asm

     PUSH   EBX
     MOV    EDX, 1
     XOR    EBX, EBX
     MOV    ECX, 8
@@Loop:
     DEC    ECX
     SHR    AL, 1
     JNC    @@Go
     SHL    EDX, CL
     OR     EBX, EDX
     SHR    EDX, CL
@@Go:
     TEST   ECX, ECX
     JNZ    @@Loop
     MOV    AL, BL
     POP    EBX
end;

function GuAV(b: byte): byte;
asm
 MOV ECX,8
 SUB AH,AH
 @@1:
 MOV DH,80h
 SHR DH,CL
 SUB DL,DL
 TEST AL,DH
 JZ @@2
 INC DL
 @@2:
 SHL DL,CL
 ADD AH,DL
 LOOP @@1
 TEST AL,80h
 JZ @@3
 INC AH
 @@3:
 MOV AL,AH
end;

function Jack128(b: byte): byte;

function GetBit(b: byte; Index: Integer): boolean;
begin
Result := (b and (1 shl Index)) <> 0;
end;

procedure SetBit(var b: byte; Index: Integer; Value: boolean);
begin
if not value then
 b := b and not (1 shl Index)
else
 b := b or (1 shl Index);
end;

var
i: integer;
Temp: boolean;
begin
Result := b;
for i := 0 to 3 do
begin
  Temp := GetBit(Result, i);
  SetBit(Result, i, GetBit(Result, 7 - i));
  SetBit(Result, 7 - i, Temp);
end;
end;

function SwapBits_APP(Value: Byte): Byte;
asm
 MOV ECX,8
 MOV AH, AL
@1:
 RCL AH, 1
 RCR AL, 1
 DEC ECX
 JNZ @1
end;

function nikkie(B: Byte): Byte;
begin
Result :=
  ((B and $01) shl 7) xor
  ((B and $02) shl 5) xor
  ((B and $04) shl 3) xor
  ((B and $08) shl 1) xor
  ((B and $10) shr 1) xor
  ((B and $20) shr 3) xor
  ((B and $40) shr 5) xor
  ((B and $80) shr 7);
end;

function SwapBits_Verg(B: byte): byte;
asm
 mov  edx, eax
 shr edx,1
 rcl eax,1
 shr edx,1
 rcl eax,1
 shr edx,1
 rcl eax,1
 shr edx,1
 rcl eax,1
 shr edx,1
 rcl eax,1
 shr edx,1
 rcl eax,1
 shr edx,1
 rcl eax,1
 shr edx,1
 rcl eax,1
 and eax,$FF
end;

function SwapBits2(B: byte): byte;
asm
 xor edx,edx;   test al,  1;   setnz dl;   xor ecx,ecx;
 add edx,edx;   test al,  2;   setnz cl;   add edx,ecx;
 add edx,edx;   test al,  4;   setnz cl;   add edx,ecx;
 add edx,edx;   test al,  8;   setnz cl;   add edx,ecx;
 add edx,edx;   test al, 16;   setnz cl;   add edx,ecx;
 add edx,edx;   test al, 32;   setnz cl;   add edx,ecx;
 add edx,edx;   test al, 64;   setnz cl;   add edx,ecx;
 add edx,edx;   test al,128;   setnz cl;   add edx,ecx;
 mov eax,edx;
end;

function CombSwap(x: byte): byte;
begin
 x:=((x and $55) shl 1) or ((x shr 1) and $55);
 x:=((x and $33) shl 2) or ((x shr 2) and $33);
 Result:=((x and $F) shl 4) or ((x shr 4) and $0F);
end;

function ReverseBitsSha1(b: byte): byte;
asm
    mov   edx, eax
    shl   eax, 8
    and   edx, $00F0
    or    eax, edx

    mov   edx, eax
    shl   eax, 4
    and   edx, $0CC0
    and   eax, $3300
    or    eax, edx

    mov   edx, eax
    shl   eax, 2
    and   edx, $2A80
    and   eax, $5500
    or    eax, edx

    shr   eax, 7
end;

function BitSwapPierre(AByte: byte): byte;
asm
 mov cl, al
 rol cl, 6
 rol al, 2
 and cl, 11001100b
 and al, 00110011b
 or al, cl
 lea ecx, [eax + eax]
 ror al, 1
 and cl, 10101010b
 and al, 01010101b
 or al, cl
end;

function ReverseBitsSha2(b: byte): byte;
asm
    mov   dl, al
    xor   ecx, ecx
    rol   al, 4
    and   dl, $CC
    and   al, $33
    or    al, dl

    mov   dl, al
    rol   al, 2
    and   dl, $AA
    and   al, $55
    or    al, dl

    rol   al, 1
end;

function ReverseBitsSha3(b: byte): byte;
asm
    rol   al, 1

    mov   dl, al
    rol   al, 2
    and   dl, $55
    and   al, $AA
    or    al, dl

    mov   dl, al
    rol   al, 4
    and   dl, $33
    and   al, $CC
    or    al, dl
end;

function ReverseBitsSha4(B: Byte): Byte;
asm
    test al, 81h
    jp   @1
    xor  eax, 81h
@1:
    test al, 42h
    jp   @2
    xor  eax, 42h
@2:
    test al, 24h
    jp   @3
    xor  eax, 24h
@3:
    test al, 18h
    jp   @4
    xor  eax, 18h
@4:
end;

function ReverseBitsSha5(B: Byte): Byte;
asm
    mov   dl, al
    rol   al, 2
    and   dl, $AA
    and   al, $55
    or    dl, al

    add   dl, dl
    setc  al
    or    al, dl
    and   dl, $CC

    rol   dl, 4
    and   al, $33
    or    al, dl
end;

function nikkie2(B: Byte): Byte;
begin
B := (B and $F0) shr 4 xor
     (B and $0F) shl 4;
Result := (B and $88) shr 3 xor
     (B and $44) shr 1 xor
     (B and $22) shl 1 xor
     (B and $11) shl 3;
end;

function nikkie_tbl(B: Byte): Byte;
const a:array[0..15] of Byte=
($00,$80,$40,$C0,$20,$A0,$60,$E0,$10,$90,$50,$D0,$30,$B0,$70,$F0);
begin
Result := a[B and $0F] xor (a[(B and $F0) shr 4] shr 4);
end;

function Achtung(input: byte): byte;
asm
  mov dl, al
  mov al, 0
  mov cl , dl
  and cl, 10001000B
  rol cl, 1
  or al, cl

  mov cl, dl
  and cl, 00010001B
  ror cl, 1
  or al, cl

  mov cl, dl
  and cl, 00100010B
  ror cl, 3
  or al, cl

  mov cl, dl
  and cl, 01000100B
  rol cl, 3
  or al, cl
end;

function CombSwapAsm(x: byte): byte;
asm
mov edx,eax
and eax,$55
shr edx,1
shl eax,1
and edx,$55
or eax,edx
mov edx,eax
and eax,$33
shr edx,2
shl eax,2
and edx,$33
or eax,edx
mov edx,eax
and eax,$F
shr edx,4
shl eax,4
and edx,$F
or eax,edx
end;


 
Sha ©   (2005-07-25 10:12) [39]

Продолжение:
Function ReverseBits(source:Byte):byte;overload;
Var
i:shortint;
Begin
Result:=0;
For i:=(SizeOf(Result)shl 3)-1 downto 0 do
Begin
  Result:=Result shl 1;
  Result:=Result or (source and 1);
  source:=source shr 1;
End;
End;

function ReverseBitsSha0(B: Byte): Byte;
const a:array[byte] of Byte=
($00,$80,$40,$C0,$20,$A0,$60,$E0,$10,$90,$50,$D0,$30,$B0,$70,$F0,
$08,$88,$48,$C8,$28,$A8,$68,$E8,$18,$98,$58,$D8,$38,$B8,$78,$F8,
$04,$84,$44,$C4,$24,$A4,$64,$E4,$14,$94,$54,$D4,$34,$B4,$74,$F4,
$0C,$8C,$4C,$CC,$2C,$AC,$6C,$EC,$1C,$9C,$5C,$DC,$3C,$BC,$7C,$FC,
$02,$82,$42,$C2,$22,$A2,$62,$E2,$12,$92,$52,$D2,$32,$B2,$72,$F2,
$0A,$8A,$4A,$CA,$2A,$AA,$6A,$EA,$1A,$9A,$5A,$DA,$3A,$BA,$7A,$FA,
$06,$86,$46,$C6,$26,$A6,$66,$E6,$16,$96,$56,$D6,$36,$B6,$76,$F6,
$0E,$8E,$4E,$CE,$2E,$AE,$6E,$EE,$1E,$9E,$5E,$DE,$3E,$BE,$7E,$FE,
$01,$81,$41,$C1,$21,$A1,$61,$E1,$11,$91,$51,$D1,$31,$B1,$71,$F1,
$09,$89,$49,$C9,$29,$A9,$69,$E9,$19,$99,$59,$D9,$39,$B9,$79,$F9,
$05,$85,$45,$C5,$25,$A5,$65,$E5,$15,$95,$55,$D5,$35,$B5,$75,$F5,
$0D,$8D,$4D,$CD,$2D,$AD,$6D,$ED,$1D,$9D,$5D,$DD,$3D,$BD,$7D,$FD,
$03,$83,$43,$C3,$23,$A3,$63,$E3,$13,$93,$53,$D3,$33,$B3,$73,$F3,
$0B,$8B,$4B,$CB,$2B,$AB,$6B,$EB,$1B,$9B,$5B,$DB,$3B,$BB,$7B,$FB,
$07,$87,$47,$C7,$27,$A7,$67,$E7,$17,$97,$57,$D7,$37,$B7,$77,$F7,
$0F,$8F,$4F,$CF,$2F,$AF,$6F,$EF,$1F,$9F,$5F,$DF,$3F,$BF,$7F,$FF);
begin
Result := (a[B]);
end;

function Default2(B: Byte): Byte;
asm

    MOVZX   EAX, AL

    MOV     EDX, EAX
    AND     EDX, 81H
    JZ      @@Go1
    XOR     EDX, 81H
    JZ      @@Go1
    XOR     EAX, 81H
@@Go1:
    MOV     EDX, EAX
    AND     EDX, 42H
    JZ      @@Go2
    XOR     EDX, 42H
    JZ      @@Go2
    XOR     EAX, 42H
@@Go2:
    MOV     EDX, EAX
    AND     EDX, 24H
    JZ      @@Go3
    XOR     EDX, 24H
    JZ      @@Go3
    XOR     EAX, 24H
@@Go3:
    MOV     EDX, EAX
    AND     EDX, 18H
    JZ      @@Go4
    XOR     EDX, 18H
    JZ      @@Go4
    XOR     EAX, 18H
@@Go4:

end;

function SwapBitsKerk(b: Byte): Byte;
asm
clc
xor ah,ah
mov cl,8
@b:
rcr al,1
rcl ah,1
dec cl
jnz @b
mov al,ah
end;

function SwapBitsAlx2(_byte: Byte): Byte;
asm
      mov     ah,al
      mov     ecx,eax
      and     eax,$330
      and     ecx,$CC0
      shr     ecx,2
      lea     eax,[4*eax+ecx]
      mov     ecx,eax
      and     eax,$550
      and     ecx,$AA0
      lea     eax,[4*eax+ecx]
      shr     eax,5
end;

function ReverseBitsSha6(b: byte): byte;
asm
mov  edx, eax         //........76543210
and  eax, $00AA       //........7.5.3.1.
and  edx, $0055       //.........6.4.2.0
lea  eax, [4*edx+eax] //.......67452301.
lea  edx, [eax+eax]   //......67452301..
and  eax, $0198       //.......67..23...
and  edx, $00CC       //........45..01..
lea  eax, [8*edx+eax] //.....45670123...
lea  edx, [eax+eax]   //....45670123....
shr  eax, 7           //............4567
and  edx, $00F0       //........0123....
add  eax, edx         //........01234567
end;

//----------------------------

function Dummy(Prm: byte): byte;
asm
 nop
 nop
 nop
 end;

function GetCPUTick: int64;
asm
 push ebx
 xor eax, eax
 cpuid
 pop ebx
 rdtsc
 cld
 nop; nop; nop; nop;
 nop; nop; nop; nop;
 end;

type
 TFun= function(Prm: byte): byte;

function Measure(Prm: byte; Fun: TFun): integer;
const
 Skip= 1024;
 LoopCount= 1024;
var
 i, j, Tick: integer;
begin;
 Result:=MaxInt;
 for i:=0 to Skip+LoopCount-1 do begin;
   Tick:=GetCPUTick;
{$IFDEF LOOP}
   for j:=1 to 10 do Fun(Prm);
{$ELSE}
   Fun(Prm);
{$ENDIF}
   Tick:=GetCPUTick-Tick;
   if (Result>Tick) and (i>=Skip) then Result:=Tick;
   end;
 end;

const
 MaxCount= 32;
type
 TName= string[15];
 TData= record
   Tick: integer;
   Name: TName;
   end;
 TDataArray= array[0..MaxCount-1] of TData;

function CompareFunc(List: TStringList; Index1, Index2: integer): integer;
var
 i1, i2: integer;
 s1, s2: string;
begin;
 s1:=List[Index1];
 s2:=List[Index2];
 i1:=StrToIntDef(Copy(s1,1,Pos(" ",s1)-1),0);
 i2:=StrToIntDef(Copy(s2,1,Pos(" ",s2)-1),0);
 if i1<i2 then Result:=-1
 else if i1>i2 then Result:=1
 else Result:=CompareText(s1,s2);
 end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
 Count: integer;
 Data: TDataArray;

procedure CollectData(Name: TName; Fun: TFun);
const
 Prm= 255;
begin;
 if Count<MaxCount then begin;
   Data[Count].Name:=Name;
   Data[Count].Tick:=Measure(Prm, Fun);
   inc(Count);
   end;
 end;

var
 sl: TStringList;
begin;
 SpeedButton1.Enabled:=false;
 //Memo1.Lines.Clear;

 Application.ProcessMessages;
 sleep(1000);
 Application.ProcessMessages;

 Count:=0;
 CollectData("Dummy", @Dummy);
 CollectData("ReverseBitsSha0", @ReverseBitsSha0);
 CollectData("nikkie_tbl", @nikkie_tbl);
 CollectData("ReverseBitsSha1", @ReverseBitsSha1);
 CollectData("ReverseBitsSha2", @ReverseBitsSha2);
 CollectData("ReverseBitsSha3", @ReverseBitsSha3);
 CollectData("ReverseBitsSha4", @ReverseBitsSha4);
 CollectData("ReverseBitsSha5", @ReverseBitsSha5);
 CollectData("nikkie2", @nikkie2);
 CollectData("nikkie", @nikkie);
 CollectData("CombSwapAsm", @CombSwapAsm);
 CollectData("CombSwap", @CombSwap);
 CollectData("SwapBits2", @SwapBits2);
 CollectData("Achtung", @Achtung);
 CollectData("SwapBits_Verg", @SwapBits_Verg);
 CollectData("Default", @Default);
 CollectData("Default2", @Default2);
 CollectData("SwapBits_APP", @SwapBits_APP);
 CollectData("ReverseBits", @ReverseBits);
 CollectData("Guav", @Guav);
 CollectData("Jack128", @Jack128);
 CollectData("BitSwapPierre", @BitSwapPierre);
 CollectData("SwapBitsKerk",@SwapBitsKerk);
 CollectData("SwapBitsAlx2",@SwapBitsAlx2);
 CollectData("ReverseBitsSha6",@ReverseBitsSha6);
 sl:=TStringList.Create;
 while Count>0 do begin;
   dec(Count);
   sl.Add(Format("%.3d  %s",[Data[Count].Tick-Data[0].Tick,Data[Count].Name]));
   end;
 sl.CustomSort(CompareFunc);
 Memo1.Lines.Assign(sl);
 sl.Free;

 SpeedButton1.Enabled:=true;
 end;


 
Alx2 ©   (2005-07-25 10:52) [40]

Sha ©   (25.07.05 10:11) [38]

>Кто ж им мерит? Им профилировать надо. А в попугаях я длиннее :)

Почему же нельзя мерить им?

Погонял твой тест на своей машине (тоже P4).
Есть довольно сильная неустойчиовсть (например, Default2 скачет от 8 тиков до 16). Потом, аргумент всегда равен 255. Несколько некорректно.



Страницы: 1 2 вся ветка

Текущий архив: 2005.08.14;
Скачать: CL | DM;

Наверх




Память: 0.61 MB
Время: 0.039 c
14-1122102943
NewWonder
2005-07-23 11:15
2005.08.14
Перспективы средств разработки.


14-1120455924
Ega23
2005-07-04 09:45
2005.08.14
С днем рождения! 4 июля


14-1122140424
X9
2005-07-23 21:40
2005.08.14
2 компа + 2 сет.платы + витая пара = troubles


4-1118705112
Strech
2005-06-14 03:25
2005.08.14
получение Background кисти окна


14-1121575392
boriskb
2005-07-17 08:43
2005.08.14
Украинцы, алло!