zliczanie bitów

arigo
Użytkownik
Użytkownik
Posty: 852
Rejestracja: 23 paź 2004, o 10:17
Płeć: Mężczyzna
Lokalizacja: Lublin
Pomógł: 28 razy

zliczanie bitów

Post autor: arigo »

Fibik pisze:Zły algorytm, przełożony na assembler, albo nawet na kod maszynowy, jest nadal złym algorytmem.
a co to ma do niemoznosci rzetelnego porownywania wydajnosci algorytmow w jezykach wysokiego poziomu?
Fibik
Użytkownik
Użytkownik
Posty: 971
Rejestracja: 27 wrz 2005, o 22:56
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 11 razy
Pomógł: 75 razy

zliczanie bitów

Post autor: Fibik »

Może nie miało mieć? Już nie pamiętam.
drunkard
Użytkownik
Użytkownik
Posty: 204
Rejestracja: 6 kwie 2005, o 14:43
Płeć: Mężczyzna
Lokalizacja: Warszawa
Pomógł: 23 razy

zliczanie bitów

Post autor: drunkard »

Żeby zakończyć w miarę merytorycznie wrzucę kod wygenerowany przez Borland C++ 5.5 z przeprosinami dla kompilatora że posądzałem go o korzystanie ze stosu dla wyników pośrednich.

; int nbits1 (byte b4[])
;
push ebp
mov ebp,esp
mov eax,dword ptr [ebp+8]
;
; {
; return t8[b4[0]] + t8[b4[1]] + t8[b4[2]] + t8[b4[3]];
;
?live16385@16: ; EAX = b4
@1:
xor edx,edx
mov dl,byte ptr [eax]
xor ecx,ecx
mov cl,byte ptr [edx+_t8]
xor edx,edx
mov dl,byte ptr [eax+1]
movzx edx,byte ptr [edx+_t8]
add ecx,edx
xor edx,edx
mov dl,byte ptr [eax+2]
movzx edx,byte ptr [edx+_t8]
add ecx,edx
movzx eax,byte ptr [eax+3]
movzx eax,byte ptr [eax+_t8]
add ecx,eax
mov eax,ecx
;
; }
Fibik
Użytkownik
Użytkownik
Posty: 971
Rejestracja: 27 wrz 2005, o 22:56
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 11 razy
Pomógł: 75 razy

zliczanie bitów

Post autor: Fibik »

Zamiast tego podwójnego indeksowania (i przekazywania wskaźnika do tablicy 4 bajtów),
można to zrobić inaczej:

int nbits(uint n)
{
return t8[n & 0xFF] + t8[(n >> 8) & 0xFF] + t8[(n >> 16) & 0xFF] + t8[(n >> 24) & 0xFF];
}

To jest szybsze (taką wersję testowałem).

Stos jest używany, raczej do przekazywania parametrów i na zmienne lokalne (jeśli jest ich sporo).
Borland 5 ma chyba opcję wyboru kompilatora: borland lub intel. Ten drugi dużo lepiej optymalizuje.
ODPOWIEDZ