我有以下代码:
<?php
$start = 1;
$timestart = microtime(1);
for ($i = 0; $i < 1000000; $i++) {
$result1 = $start * 4;
}
echo "\n";
echo microtime(1) - $timestart;
echo "\n";
$timestart = microtime(1);
for ($i = 0; $i < 1000000; $i++) {
$result2 = $start << 2;
}
echo "\n";
echo microtime(1) - $timestart;
echo "\n";
输出:
0.14027094841003
0.12061500549316
我在互联网上发现了一个谷歌面试问题(我想申请开发人员,但我意识到我不能),其中一个问题询问最快的方法是乘以一个数字。我的第一个想法是使用*
符号,所以我测试了它。
我的问题是,为什么比乘法更快地移位?
答案 0 :(得分:16)
因为位移是计算机一直在硬件中进行的操作,所以对于CPU来说这是一个明智的选择。乘以任意数字是比较困难的,因为它不一定使用简单的位移来完成,但需要实际工作。将一个小整数乘以4恰好是一个与左移2相同的操作。但即使编译器/运行时/ CPU将此操作优化到一个位移,一些代码首先需要识别它可以通过这种方式进行优化,这比简单的位移本身更有效。
无论哪种方式,它只是更多的工作,因为这两个操作完全不同,即使某些操作的结果是相同的。
答案 1 :(得分:13)
因为位移是一种可以直接在硬件中实现的操作,而硬件很少直接实现乘法运算。使用一些简单的逻辑门可以实现乘以2的幂乘法,而乘以任意被乘数需要至少几次乘以2的幂加上相互叠加的自加运算(5 = 2) * 2 + 1)。我不知道PHP语言是否通过使用任何可用的低级别调用来专门实现了一个移位操作,但如果没有,我会感到惊讶。
资料来源:多年经验+计算机科学教育
答案 2 :(得分:1)
在英特尔Sandbrigde CPU上,它似乎是一个转变,立即成本约为1个时钟周期,而乘法大约需要3-4个周期。显然,整个程序的性能受到更多因素的影响,而不仅仅是原始乘法,但它足以产生差异。现在大多数编译器优化乘法2 ^ n乘以移位(编译器编写者喜欢优化代码:))但是PHP解释器可能没有。