【问题标题】:Can changing the scope in which memory is automatically allocated affect performance?更改自动分配内存的范围会影响性能吗?
【发布时间】:2015-06-25 04:25:23
【问题描述】:

我有一个程序,其中涉及对少数函数的大量调用,每个函数都在本地分配固定大小的数组(总共大约几百字节)。假设将所有分配移动到 main 然后传递指针会获得更好的速度是否正确?换句话说,从堆栈指针中减去是否需要线性或恒定时间,如果需要恒定时间,与将指针传递给函数相比,成本是多少?

我做了一个小速度测试。示例 #1 运行得更快一些。

示例 #1

using namespace std;
#include <iostream>
int f(int* a){

    // do stuff

    return 0;
}

int main(){

    int a[1000];

    int x;
    for (int i = 0; i < 50000; ++i){
        x=f(a);
    }
    return 0;
}

示例 #2

using namespace std;
#include <iostream>

int f(){

    int a[1000];

    // do stuff...

   return 0;
}

int main(){

    for (int i = 0; i < 50000; ++i){
        x=f();
    }
    return 0;
}

【问题讨论】:

  • 有人能解释一下他想问什么吗?
  • 我的意思是,如果你在函数中声明一个固定大小的数组,有时将声明移动到 main 然后将指针传递给函数,这样你就不必继续分配空间了每次通话?或者,在不使用函数时保持堆栈较小会更好
  • 也许吧。也许不吧。我们不知道。性能无法猜测,必须通过 profiling 来衡量。但在重要之前,不要担心。就像,完全一样。
  • 不,这样假设是不正确的。堆栈空间“分配”通常是单次减法运算。而且您考虑的所有事情都不是“静态的”。
  • 一般来说,许多人认为在尽可能窄的范围内定义变量是一种很好的风格(当然,同时避免重新计算相同的值或数据)。所以将数组向外移动到 另一个函数 有点走错路了......

标签: c++ c performance memory-management


【解决方案1】:

这两种写法没有区别。

在某些系统上,堆栈上的大分配可能会导致问题,但 [1000] 是一个相对较小的数组,您永远不会分配超过一个。

考虑 f() 是递归函数的情况。那么就有可能进行大量的重复分配。

【讨论】:

    【解决方案2】:

    您似乎将本地空间的分配理解为昂贵,而实际上并非如此(它只是堆栈指针的减法)。

    考虑到您在main() 中使用反向引用“半全局”局部变量的指针可能会造成混乱,我看不出您的建议有任何实际价值,尽管当然可以提出一个证明我错了的特殊例子。

    一般来说,尝试在编码的早期阶段进行优化是个坏主意。特别是如果您为了(有问题的)效率而牺牲简单性和易于阅读/理解。

    尽量编写简单明了的代码。如有必要,在后期进行优化,而不是在明确发现瓶颈之前进行优化(这并不容易)。

    【讨论】:

    • 好的,这很有帮助。我有一个程序调用一些函数数百万次,并将所有本地声明移动到 main(大约 40 个数组)。
    • 那么可能值得确保您为编译器提供正确内联所需的所有必要信息(例如,不要在单独的翻译单元中定义这些函数,确保在调用它们之前已经看到函数, 等等)。您不需要内联声明这些函数,只需给编译器自己决定所需的一切。这不会节省局部变量空间,但可能会节省大量参数传递和函数调用开销。而且这与我上面所说的并不矛盾,因为它不会影响清晰度和可读性。
    • 只有两个关于从堆栈指针中减去的问题:1)它需要线性时间还是常数时间? 2)一般来说,它比将指针传递给函数便宜吗?
    • @NathanSchmidt 它是恒定的时间并且非常便宜,通常只是堆栈指针寄存器上的算术。当您的对象涉及堆时(例如:std::vector),您所做的事情可能真正通过优化的生产构建得到回报。而且我仍然建议您不要使用分析器和一些良好的测量值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    相关资源
    最近更新 更多