unix中的以下代码需要time
命令报告〜9s。
int main()
{
double u = 0;
double v = 0;
double w = 0;
int i;
for (i = 0;i < 1000000000;++i) {
v *= w;
u += v;
}
printf("%lf\n",u);
}
我不明白为什么当我用v *= w;
更改v *= u;
时,执行时间几乎翻倍
答案 0 :(得分:5)
当您将v *= w
更改为v *= u
时,这两个语句之间存在相互依赖关系。因此,第一个语句必须在执行u += v
之前完成,这可能是提高性能的原因,因为编译器无法并行执行。
答案 1 :(得分:2)
可能是因为编译器发现w永远不会被修改,因此可以编译成常量,而变量u被修改,因此必须有自己的内存。
答案 2 :(得分:1)
编译器优化v * = w;到v = 0;并且可能是u + = v到u = 0;所以这些操作永远不会发生。
这是我做的测试。每个版本都完成了10次并取平均值。
for (i = 0;i < 1000000000;++i) {
v *= w;
u += v;
}
4.0373秒
for (i = 0;i < 1000000000;++i) {
v *= u;
u += v;
}
7.3733秒
for (i = 0;i < 1000000000;++i) {
v *= 0;
u += 0;
}
4.0149秒