FNV32 hash in assembly

http://www.isthe.com/chongo/tech/comp/fnv/#PowerBASIC
に掲載されているの物をVCでコンパイル可能なインラインアセンブラで書き下しました。
移植するにあたって
http://www.geocities.co.jp/SiliconValley-Cupertino/3384/
アセンブラの話を参考にしました。


もちろんソースコードNYSLです。

offset_basis__には0もしくは2166136261を入れて使用してください。

typedef unsigned int uint32;

uint32 fnv32_asm(const void *p,size_t siz,uint32 offset_basis__)
{

uint32 ret_val = 0;
if(siz <= 0) return ret_val;
_asm{
mov esi, p
mov ecx,siz
mov eax, offset_basis__
mov edi, 01000193h
xor ebx, ebx
_NEXT__BYTE:
mul edi
mov bl,[esi]
xor eax,ebx
inc esi
dec ecx
jnz _NEXT__BYTE
mov ret_val,eax //;return ebx
}
return ret_val;
}

しかし、この実装を利用する上で一番大切なことは・・・
C言語のコードより遅いって事だ・・・orz
ranking_tiemr / clock type : QueryPerformanceClock / compile mode : RELEASE

1 / fnv32 in c / 2312
2 / fnv32 in asm / 2556
3 / fnv64 in c / 7878
でも、偶に速いこともある

1 / fnv32 in asm / 2572
2 / fnv32 in c / 3237
3 / fnv64 in c / 7677
多分、条件によって一長一短があるのだろう・・・
だが、しっかりrealtimeにlockして処理しているんだが・・・Camelliaの実装報告書にrdtscでのclock計測は厳密にはあてにならないと書いていた覚えがあったので多分、この数値もあてにならない。
まぁ、移植性の高いCでのimplementationに軍配が上がるって事で・・・
以上!