gpt4 book ai didi

performance - 为什么按位异或 (^) 在 Firefox 中比不等于 (!=) 比较快?

转载 作者:行者123 更新时间:2023-12-02 03:29:35 25 4
gpt4 key购买 nike

我正在阅读其他网站 (Computer Science - Can a Minimum Possible Efficiency be proven?) 的一篇文章,内容是关于假设最坏情况下的最小 Big-O 时间。

其中一个答案详细解释了比较二进制值(或类似值)所需的时间。

我心里想:为什么不按位运算呢?

我用 Javascript 制作了这个模型代码:

console.time('^');
for(var i=0;i<1e5;i++)13^15;
console.timeEnd('^');

console.time('!=');
for(var i=0;i<1e5;i++)13!=15;
console.timeEnd('!=');

我真的很惊讶!

使用 ^(按位异或)的循环几乎可以快 3ms!

这怎么可能?

为什么按位异或 (^) 比不等于 (!=) 比较快?


其他可能相关的信息:

我已经在 Windows 7 Home Premium x64 上运行的 Firefox 34.0.5 上进行了测试。

我还在 Opera 12.17(x64) 和 Chrome 39.0.2171.95 上尝试过这段代码,行为几乎相似,因为使用 ^ 的代码在 80% 的测试中速度更快。


另一个惊喜:

在 php 中,运行这个:

$now=microtime(true);
for($i=0,$x=0;$i<1e6;$i++)$x+=13^15;
echo microtime(true)-$now,PHP_EOL;

$now=microtime(true);
for($i=0,$x=0;$i<1e6;$i++)$x+=13!=15;
echo microtime(true)-$now,PHP_EOL;

显示完全相同的效果:^!= 快。
使用 $x+=!13^15; 而不是 $x+=13^15; 的速度快了 70%。

我在 http://writecodeonline.com/php/ 上测试过在 linux x64 上运行 PHP 5.3。

此代码有来自用户@AlexK 的建议,关于以下评论:

13^15 is a constant noop, perhaps its simply optimised away (try something effective x+=13^15;)

最佳答案

你找错人了。

例如,在 2GHz CPU 上,^ 或 != 可以在纳秒左右的时间内执行。执行其中的 1e6 次需要 1 毫秒,而不是 460 毫秒。这告诉我两件事:

  1. for花费大量时间,并且
  2. JavaScript 是解释而不是编译

请注意,解释器不一定要花时间进行优化。一个真正好的优化器会变成 for($i=0,$x=0;$i<1e6;$i++)$x+=13^15;进入$x = 2000000 .它显然没有那样做。好吧,转了就不好说了$x+=13^15进入$x+=2 .

我们再来看一件事。在机器级别,甚至在交互级别$x+=13!=15$x+=13^15 更复杂.两者都涉及$x+= ,但是 13^15是单个操作,而 13!=15 (在这种情况下!)是两个操作——首先比较 != 的 13 和 15。得到 true,然后将 true 转换为 1。在硬件级别有很多方法可以做到这一点——大多数涉及跳转,这是昂贵的。还有其他技术涉及多个 bool /移位/等指令,只是为了避免跳转。

也许 13!=15比较慢。但是由于 for 循环的大量开销,您不知道有多少。

不管怎样,这重要吗?在某些情况下这两个操作可以互换吗?您没有与 (13^15)!=0 进行比较这可能是等价的。

关于performance - 为什么按位异或 (^) 在 Firefox 中比不等于 (!=) 比较快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27922003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com