使用大局部变量优化频繁调用的函数 (C++)

Optimizing frequently called function with large local variables (C++)

假设有一个函数需要调用数百万次。此函数执行的算术运算并不繁重,因此唯一重要的是所有变量的分配速度。我们还假设变量总是分配在堆栈上。 最简单的案例:

void doSomething(){
    int aReallyLargeVariable[10000];
    ...performing a few light operations on that variable and returning nothing...
}

我知道当函数 returns 它的所有变量都被销毁时,所以
通过将其设为静态或全局来缓存此变量不是更好吗?优化它的最佳方法是什么?

不是分配会导致性能问题。问题是初始化它所以 when

    int aReallyLargeVariable[10000];

不会花很多时间

    int aReallyLargeVariable[10000] = {0};

会的。动态创建大对象也会导致问题。

如果您的函数没有很重的逻辑并且仅使用基本类型,只需将其定义为 inline 并且不必担心性能。

如果您需要定义大量对象,请考虑另一种数据结构,例如 stackvector,它不需要包含 1000 个或更多元素

优化这个函数,考虑到它被多次调用,第一步应该是do not declare the large variable locally。当您这样做时,会发生一些事情:

  • 浪费了大量堆栈 space,因为您在本地声明了数组并且可能只使用了几个值。
  • 此声明导致的堆栈操作 (push/pop) 可能超过函数必须执行的实际工作。

你最好在别处声明这个数组(如果必须的话,全局声明它)并传入一个指向数组的指针。这样你也可以重用内存而不是浪费时间重新分配。

我建议将它们分配为静态,这样整个 int aReallyLargeVariable[10000]; 就不会在每次调用函数时分配和释放大量内存来打扰堆栈。但是,您也可以声明 int aReallyLargeVariable[10000]; 作为全局变量,但许多开发人员讨厌在他们的代码中使用大量全局变量。如果您不喜欢函数中的静态变量(由于并发执行等原因)并且也不喜欢全局变量,那么您可以在全局范围内将变量声明为静态变量,以便变量名仅在上下文中有效它的声明可以防止链接器错误。

Source.cpp

static int aReallyLargeVariable[10000];
void myFunction()
{
    aReallyLargeVariable[1] = 10;
}

Object.cpp

int aReallyLargeVariable[10000];  /* No name collisions during linking */

注意:只有当您不决定在 Object.cpp[=26 中包含 Source.cpp 时它才有效=] 或反之亦然