为什么这个微小的c代码更改会导致执行时间的巨大差异?

时间:2013-02-10 16:29:16

标签: c performance

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;时,执行时间几乎翻倍

3 个答案:

答案 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秒