我正在阅读其他网站上的一篇文章(计算机科学 - 可以证明最小可能效率吗?)关于假设最坏情况下的最小 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('!=');
我真的很惊讶!
使用^
(bitwise-xor) 的循环可以快 3毫秒!
这怎么可能?
为什么按位异或 ( ^
) 比不等 ( !=
) 比较快?
其他可能相关的信息:
我已经在 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 是一个恒定的 noop,也许它只是被优化掉了(尝试一些有效的 x+=13^15;)