Author: Koundinya Veluri
Date: 03:54:38 01/15/02
Go up one level in this thread
On my computer, bsf is faster if the 1-bit is less significant and bsr is faster if the 1-bit is more significant, so the FirstBit() and LastBit() versions with the jumps are running faster on average. How does this test on other processors? I'm curious... #include <iostream> using namespace std; #include <windows.h> #define ITERATIONS (1000000000) #define FB (0x8000000000000000) #define LB (1) inline const int FirstBit1(const unsigned __int64 bb); inline const int FirstBit2(const unsigned __int64 bb); inline const int LastBit1(const unsigned __int64 bb); inline const int LastBit2(const unsigned __int64 bb); inline const int LastBit3(const unsigned __int64 bb); int main() { unsigned int a, b, t; cout << "Press enter to start..."; cin.ignore(); cout << endl; t = GetTickCount(); for(a = 0; a < ITERATIONS; ++a) b = FirstBit1(FB); t = GetTickCount() - t; cout << t << endl; cout.flush(); t = GetTickCount(); for(a = 0; a < ITERATIONS; ++a) b = FirstBit2(FB); t = GetTickCount() - t; cout << t << endl; cout.flush(); cout << endl; cout.flush(); t = GetTickCount(); for(a = 0; a < ITERATIONS; ++a) b = LastBit1(LB); t = GetTickCount() - t; cout << t << endl; cout.flush(); t = GetTickCount(); for(a = 0; a < ITERATIONS; ++a) b = LastBit2(LB); t = GetTickCount() - t; cout << t << endl; cout.flush(); t = GetTickCount(); for(a = 0; a < ITERATIONS; ++a) b = LastBit3(LB); t = GetTickCount() - t; cout << t << endl; cout.flush(); return 0; } const int FirstBit1(const unsigned __int64 bb) { __asm { bsf eax, [bb] jnz L10 bsf eax, [bb + 4] add eax, 32 L10: } } const int FirstBit2(const unsigned __int64 bb) { __asm { bsf eax, [bb + 4] add eax, 32 bsf eax, [bb] } } const int LastBit1(const unsigned __int64 bb) { __asm { bsr eax, [bb + 4] jz L10 add eax, 32 jmp L11 L10: bsr eax, [bb] L11: } } const int LastBit2(const unsigned __int64 bb) { __asm { bsr eax, [bb + 4] jnz L10 bsr eax, [bb] sub eax, 32 L10: add eax, 32 } } const int LastBit3(const unsigned __int64 bb) { __asm { bsr eax, [bb] sub eax, 32 bsr eax, [bb + 4] add eax, 32 } } Output on my computer: Press enter to start... 5898 5899 4747 6509 7080 -------- Regards, Koundinya
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.