我应该避免在循环中重复访问相同的方法吗?

时间:2018-05-21 00:30:14

标签: c++ performance compiler-optimization

我担心程序的最终性能,同时,我不想在程序中过度或不必要地惩罚程序员。

例如,在下面的代码中,它将返回相同的getPosition方法值10000次:

vector <int> arr;
for (int i=0; i<10000 ; i++)
    arr.push_back(i + window.getPosition().x)

在这个特定情况下,我知道window.getPosition().x 将始终返回相同的值

为避免性能下降,我应该将代码更改为,例如:

vector <int> arr;
int x = window.getPosition().x;
for (int i=0; i<10000 ; i++)
    arr.push_back(i + x);

这总是需要额外的程序员关注。

或者是否有一些智能缓存,我应该在哪里担心它?

2 个答案:

答案 0 :(得分:2)

这绝对是个好主意。即使调用方法的成本非常小,存储单个int只需花费几个字节,几乎肯定会更快。您也可以将其声明为const,以使其目的更加明确。

此外,如果您关注效率,则应考虑为矢量保留内存。现在,当您将元素推回arr时,您将不得不重新分配几次。由于您在该循环中运行了10000次,因此必须复制所有这些信息效率非常低。由于您知道需要10000个元素的空间,因此您应该在循环之前调用arr.reserve(10000);

答案 1 :(得分:2)

也许;这将取决于您调用的代码对编译器的可见性(LTO与否?所有可见或单独的目标文件?)如果编译器可以证明它无法更改,编译器将为您缓存它。但看似无辜的东西可能会阻止编译器知道它无法改变。

这里的开销可能很小,而且更简单的代码更容易维护。写simpker,更清楚,更明显正确的一个。然后分析您的代码以查找热路径。浏览这些热门路径并进行这种优化,并重新编译为aee,如果值得的话。

经过十年以上的努力,您将感受到大约25%准确度的热门路径,并且您可以自我辩解先发制人地进行微小优化,然后再使用催眠 - 充气信心进行分析。或者,你知道,简介。