移位与PHP中的乘法

2022-08-30 20:00:06

我有以下代码:

<?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

我在互联网上发现了一个谷歌面试问题(我想申请一个开发人员,但我意识到我不能),其中一个问题问到最快的方法是乘以一个数字。我的第一个想法是使用这个标志,所以我测试了它。*

我的问题是,为什么位移比乘更快?


答案 1

因为位移是计算机在硬件中一直在做的事情,所以对于CPU来说,这是一个明智的选择。任意数字相乘是比较困难的事情,因为它不一定能用简单的位移来完成,而是需要实际工作。将小整数乘以 4 恰好是一个与左移 2 相同的操作。但是,即使编译器/运行时/CPU将此操作优化到位移,一些代码首先需要认识到它可以以这种方式进行优化,这比简单的位移本身要多得多。

无论哪种方式,这都只是更多的工作,因为这两个操作做完全不同的事情,即使某些操作的结果是相同的。


答案 2

因为位移是一种可以直接在硬件中实现的操作,而硬件很少直接实现乘法操作。乘以二的幂可以通过几个简单的逻辑门来实现,而乘以任意乘法至少需要乘以二的幂加上彼此堆叠的自加运算(5 = 2 * 2 + 1)。我不知道PHP语言是否通过使用任何可用的低级调用来专门实现shift操作,但是如果它没有,我会感到惊讶。

来源:多年的经验+计算机科学教育


推荐