我担心程序的最终性能,同时,我不想在程序中过度或不必要地惩罚程序员。
例如,在下面的代码中,它将返回相同的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);
这总是需要额外的程序员关注。
或者是否有一些智能缓存,我应该在哪里担心它?
答案 0 :(得分:2)
这绝对是个好主意。即使调用方法的成本非常小,存储单个int
只需花费几个字节,几乎肯定会更快。您也可以将其声明为const
,以使其目的更加明确。
此外,如果您关注效率,则应考虑为矢量保留内存。现在,当您将元素推回arr
时,您将不得不重新分配几次。由于您在该循环中运行了10000次,因此必须复制所有这些信息效率非常低。由于您知道需要10000个元素的空间,因此您应该在循环之前调用arr.reserve(10000);
。
答案 1 :(得分:2)
也许;这将取决于您调用的代码对编译器的可见性(LTO与否?所有可见或单独的目标文件?)如果编译器可以证明它无法更改,编译器将为您缓存它。但看似无辜的东西可能会阻止编译器知道它无法改变。
这里的开销可能很小,而且更简单的代码更容易维护。写simpker,更清楚,更明显正确的一个。然后分析您的代码以查找热路径。浏览这些热门路径并进行这种优化,并重新编译为aee,如果值得的话。
经过十年以上的努力,您将感受到大约25%准确度的热门路径,并且您可以自我辩解先发制人地进行微小优化,然后再使用催眠 - 充气信心进行分析。或者,你知道,简介。