【问题标题】:doing something in an unusual but efficient way以不寻常但有效的方式做某事
【发布时间】:2010-11-05 23:34:13
【问题描述】:

我今天看了一个视频,视频中的那个人只是写这个来了解一个数字是否是偶数:

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
模组操作经过的时间:00:00:06.8323908

令人惊讶的是,两次切换比在我的电脑上操作一次更快。

【问题讨论】:

  • even = (number&amp;1) == 0 有什么问题?

标签: algorithm performance language-agnostic bit-manipulation


【解决方案1】:

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

现在讲课:这些肮脏的把戏可能会更快,但要花很长时间才能理解。

大多数计算对性能的要求并不高,因此需要这样的技巧。在奇偶情况下,number % 2 == 0number/2*2 == numbernumber&gt;&gt;1&lt;&lt;1 == number 更清晰易读。也就是说,在普通应用程序中,您应该始终使用更简单、更标准的选项,因为它会使您的代码更易于理解和维护。

但是,也有类似这样的技巧的用例。尤其是在大规模的数学或科学计算和计算机图形学中,像这样的技巧可以挽救你的生命。 Quake 3 中的 John Carmack's "magic inverse square root" 就是一个很好的例子。

【讨论】:

  • 当您使用有限的指令集和只有这么多的周期为微控制器进行汇编编程时,其中一些技巧实际上非常有用。然而,在高级语言中,它们通常不是必需的,因为编译器通常会很好地优化它们。
  • @Insilico:当然,尽管它们在主流编程中很少需要。
【解决方案2】:

这本书Hacker's Delight 有 300 页,只有这样的内容。它不便宜,但它是一个小玩意儿的圣经。

【讨论】:

    猜你喜欢
    • 2020-05-11
    • 1970-01-01
    • 2011-02-02
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 2021-08-31
    相关资源
    最近更新 更多