把第三版实现里的GetMinElement用一个新学到的位运算技巧重写了一下,又快了30%。 运行时间从14秒降低到10秒。
[code]
uint64_t v = ...;
uint64_t m5 = 0x00000000ffffffff;
uint64_t m4 = 0x0000ffff0000ffff;
uint64_t m3 = 0x00ff00ff00ff00ff;
uint64_t m2 = 0x0f0f0f0f0f0f0f0f;
uint64_t m1 = 0x3333333333333333;
uint64_t m0 = 0x5555555555555555;
v = v & -v;
uint8_t q = (v & m5) ==0 ? 32 : 0;
if((v & m4) ==0) q+=16;
if((v & m3) ==0) q+=8;
if((v & m2) ==0) q+=4;
if((v & m1) ==0) q+=2;
if((v & m0) ==0) q+=1;
return q;
[/code]
可惜我不太会汇编。不然这段代码还有很大的优化空间。没准可以SIMD一把。
当然,这个位运算有更好的方式实现,所以我就不在这里纠缠了。
--
FROM 107.139.34.*