第一次尝试
我定义了函数regularmultiply()和bitwisemultiply()如下:
int regularmultiply(int j)
{
return j * 2.25;
}
int bitwisemultiply(int k)
{
return (k << 1) + (k >> 2);
}
在使用 Instruments 进行分析时(在 2009 Macbook OS X 10.9.2 上的 XCode 中),bitwisemultiply 的执行速度似乎比 regularmultiply 快 2 倍。
汇编代码输出似乎证实了这一点,bitwisemultiply 将大部分时间用于寄存器改组和函数返回,而 regularmultiply 将大部分时间用于乘法。
正则乘法:
按位乘法:
但我的试炼时间太短了。
第二次尝试
接下来,我尝试使用 1000 万次乘法来执行这两个函数,这次将循环放入函数中,这样所有函数的进入和离开都不会混淆数字。而这一次,结果是每个方法都花费了大约 52 毫秒的时间。因此,至少对于相对较大但不是大量的计算,这两个函数需要大约相同的时间。这让我很吃惊,所以我决定计算更长的时间和更大的数字。
第三次尝试
这一次,我只将 1 亿乘以 5 亿乘以 2.25,但 bitwisemultiply 实际上比 regularmultiply 慢一点。
最后的尝试
最后,我切换了这两个函数的顺序,只是为了看看 Instruments 中不断增长的 CPU 图表是否可能会减慢第二个函数的速度。不过,regularmultiply 的表现还是稍好一些:
这是最终程序的样子:
#include <stdio.h>
int main(void)
{
void regularmultiplyloop(int j);
void bitwisemultiplyloop(int k);
int i, j, k;
j = k = 4;
bitwisemultiplyloop(k);
regularmultiplyloop(j);
return 0;
}
void regularmultiplyloop(int j)
{
for(int m = 0; m < 10; m++)
{
for(int i = 100000000; i < 500000000; i++)
{
j = i;
j *= 2.25;
}
printf("j: %d\n", j);
}
}
void bitwisemultiplyloop(int k)
{
for(int m = 0; m < 10; m++)
{
for(int i = 100000000; i < 500000000; i++)
{
k = i;
k = (k << 1) + (k >> 2);
}
printf("k: %d\n", k);
}
}
结论
那么我们能对这一切说些什么呢?我们可以肯定地说,优化编译器比大多数人都好。此外,当有大量计算时,这些优化会更加突出,这是您真正想要优化的唯一时间。因此,除非您在汇编中编写优化代码,否则将乘法更改为位移可能不会有太大帮助。
考虑应用程序的效率总是好的,但微效率的收益通常不足以保证降低代码的可读性。