对于整数和浮点数(它基本上可以转换为位移),除以 2 的幂的编译时常数非常快(与乘以编译时常数相当)。
对于浮点数,即使是动态除以 2 的幂也比常规(动态或静态除法)快得多,因为它基本上变成了指数的减法。
在所有其他情况下,除法似乎比乘法慢几倍。
对于动态除数,我的Intel(R) Core(TM) i5 CPU M 430 @ 2.27GHz的减速因子似乎约为 8,静态因子约为 2。
结果来自我的一个小基准,我之所以做出这个基准,是因为我对此有点好奇(注意二次方的畸变):
- ulong -- 64 位无符号
- 标签中的 1 表示动态参数
- 标签中的 0 表示静态已知参数
结果是从以下 bash 模板生成的:
#include <stdio.h>
#include <stdlib.h>
typedef unsigned long ulong;
int main(int argc, char** argv){
$TYPE arg = atoi(argv[1]);
$TYPE i = 0, res = 0;
for (i=0;i< $IT;i++)
res+=i $OP $ARG;
printf($FMT, res);
return 0;
}
分配 $-variables 并编译-O3
并运行生成的程序(动态值来自命令行,因为从 C 代码中很明显)。