【问题标题】:Should I avoid repeated access to the same method within a loop?我应该避免在循环中重复访问相同的方法吗?
【发布时间】:2018-05-21 00:30:13
【问题描述】:

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

以下面的代码为例,它将返回相同的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);

这总是涉及额外的程序员的关注。

或者有什么智能缓存,哪里不用担心?

【问题讨论】:

  • 如果您确定该函数在这种情况下将充当常量,那么它实际上是等效的。我也相信常数比大多数函数计算时间短。

标签: c++ performance compiler-optimization


【解决方案1】:

也许;这将取决于您调用的代码对编译器的可见性(LTO 与否?所有可见的,还是单独的目标文件?)如果编译器可以证明它不能更改,编译器将为您缓存它。但是看似无害的事情却可以让编译器不知道它不能改变。

这里的开销可能很小,更简单的代码更容易维护。写一个更简单、更清晰、更明显正确的。然后分析您的代码以查找热路径。遍历那些热门路径并进行这种优化并重新配置到 aee(如果值得的话)。

在这样做十多年后,您会感觉到热路径的准确率大约为 25%,并且您可以自我证明先发制人地进行较小的优化,然后再以 dunning-krugar 夸大的信心进行分析。或者,你知道的,个人资料。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-02
      • 1970-01-01
      • 2020-04-22
      • 2021-09-21
      • 1970-01-01
      • 2017-03-15
      • 2012-10-14
      • 1970-01-01
      相关资源
      最近更新 更多