2

unix 中的以下代码需要约 9 秒的time命令报告。

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;

4

3 回答 3

5

当您更改v *= wv *= uthen 时,这两个语句之间存在相互依赖关系。因此,第一条语句必须在执行之前完成,u += v这可能是提高性能的原因,因为编译器无法并行执行。

于 2013-02-10T16:34:19.237 回答
2

可能是因为编译器看到 w 从未被修改过,因此可以编译为常量,而变量 u 已修改,因此必须拥有自己的内存。

于 2013-02-10T16:33:07.253 回答
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 秒

于 2013-02-10T16:32:19.347 回答