以不寻常但有效的方式做某事

时间:2010-11-05 23:34:14

标签: algorithm performance language-agnostic bit-manipulation

我今天观看了一段视频,视频中的人只是写下来了解一个数字是否均匀:

number/2*2 == number ? true : false ; 

当我回到家中并与

比较时,我试过了
number % 2 == 0 ? true : false ; 

第二个更快,然后我改变了第一个:

number>>1<<1 == number ? true : false; 

这次将数字向右移动一次,向左移动一次更快:D 识别所有数字的性能差异不大,仅为0-1秒 在1到1000000000之间,但我非常喜欢它,并希望听到你的这些技巧。

还有什么? =)

来自Russell Borogove的另一个想法=)

(number&1) == 0;

结果:

经过的时间和操作:00:00:07.0504033
换班操作经过的时间:00:00:06.4653698
使用Mod操作的时间:00:00:06.8323908

令人惊讶的是,移动两次比我的计算机上的单个操作更快。

2 个答案:

答案 0 :(得分:7)

麻省理工学院实际上保留了这样的事情清单,HAKMEM,可以在http://www.inwap.com/pdp10/hbaker/hakmem/hakmem.html找到。大多数与编程相关的都是用汇编语言编写的,但据我所知,其中一些已经在http://graphics.stanford.edu/~seander/bithacks.html翻译成了C.

现在进行一个讲座:这些肮脏的技巧可能会更快,但需要花费太长时间才能理解。

大多数计算不是那么表现至关重要,以至于这样的技巧是必要的。在奇偶情况下,number % 2 == 0number/2*2 == numbernumber>>1<<1 == number更清晰,更易读。也就是说,在正常的应用程序中,您应该始终使用更简单,更标准的选项,因为它将使您的代码更易于理解和维护。

然而,有这样的技巧的用例。特别是在大型数学或科学计算和计算机图形学中,这些技巧可以挽救你的生命。 Quake 3中的一个很好的例子是John Carmack's "magic inverse square root"

答案 1 :(得分:1)

这本书Hacker's Delight只有300页,只有这样的东西。它并不便宜,但它是一个有点笨拙的圣经。