【发布时间】:2014-04-20 16:39:12
【问题描述】:
我尝试将算术加法与我编写的使用按位运算的函数进行比较 - 发现后者几乎 10x 慢。造成这种速度差异的原因是什么?由于我在循环中添加了相同的数字,编译器是否在第一种情况下将其重写为更优化的值?
使用算术运算:
int main()
{
clock_t begin = clock();
int x;
int i = 1000000000;
while(i--) {
x = 1147483000 + i;
}
printf("%d\n", x);
clock_t end = clock();
double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
printf("time spent = %f\n", time_spent);
return 0;
}
输出:
1147483000
time spent = 3.520000
使用位运算符:
while loop 内的行被替换为:
x = add(1147483000, i);
这是add 函数:
int add(int x, int y) {
while(y != 0) {
int carry = (x & y);
x = x ^ y;
y = carry << 1;
}
return x;
}
输出:
1147483000
time spent = 32.940000
【问题讨论】:
-
你确定这个额外的时间不是函数调用所需的时间(开销)。我在某处读过这些。尝试将您的 add 功能块放入代码中,看看它是否在运行时间上有很大差异。还可以尝试查看这两种方法生成的汇编代码。
-
@CrystalMeth 如果此处的函数调用导致额外的 29 秒,您需要担心更大的问题。
-
@hvd :我想说的是函数调用可能是造成额外时间的因素之一。我没有说这是唯一的原因。
-
你正在用三个指令的循环替换单个指令,你很惊讶它变慢了?
-
@CrystalMeth 我将功能块放入代码中 - 没有区别。我不太擅长组装。
标签: c bit-manipulation bitwise-operators compiler-optimization