定义静态全局数组以避免在函数中定义它

时间:2012-05-05 18:38:24

标签: c++ optimization static-variables

我刚开始使用一大堆代码,作者声称这些代码“高度优化”。在某些时候他们这样做:

namespace somename 
{ 
  static float array[N]; 
} 

float Someclass::some_function(std::vector<float>& input) 
{
  // use somename::array in some way 
  return result; 
}

由于持久性代码问题(我们几乎无法控制),作者未在课程中包含somename::array。调用some_function时,该类对数组执行O(N ^ 2)运算。所以,如果我在函数调用中移动array

float Someclass::some_function(std::vector<float>& input) 
{
  float array[N];
  // use somename::array in some way 
  return result; 
}

期望性能下降是否合理?换句话说,很明显,在许多不同的系统和编译器中,作者的优化(使用全局数组而不是函数内部的数组)将有助于提高性能?

3 个答案:

答案 0 :(得分:2)

由于数字很重要:

./ trial2.out 59.08s user 0.01s system 88%cpu 1:07.01 total

./ trial.out 59.40s用户0.00s系统99%cpu 59.556总计

源代码:http://pastebin.com/YA2WpTSU(使用备用代码进行评论和测试)

所以,没有区别。编译:

gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)

在函数中使用非静态数组时会产生时间:

./trial.out  57.32s user 0.04s system 97% cpu 58.810 total

./trial.out  57.77s user 0.04s system 97% cpu 59.259 total

所以再一次,没有区别。因为当你使用数组时它是你的函数堆栈的一部分而不是堆,每次调用函数时都没有保留内存的开销。如果您使用动态分配,情况将完全不同(在这种情况下,我确实会怀疑性能会有很大差异)。

答案 1 :(得分:1)

也许你没有注意到差异,但有一个!使用static关键字,该数组存在于程序的DATA段中,并且它仍然是整个运行时。如果没有static关键字,则数组驻留在堆栈中,并在每次调用函数时进行初始化。尽管如此,堆栈版本可能是更好的选择,因为它具有更好的局部性,因此更少的缓存未命中。您必须衡量哪种版本更适合您的情况。在我的情况下(一个阵列有69个64位数字和第二个二维数组48 * 12个字符)静态版本明显更快。

答案 2 :(得分:0)

唯一的区别是“数组”是全局分配的(如果声明为静态),如果在函数体中声明,它将在堆栈上“分配”。这里真正重要的是阵列的大小(N)。 如果它是一个大数组,你可以保持静态,因为你可能无法在堆栈上声明它。 第三种选择是动态分配它(堆,使用new关键字)。但是,所有这些假设都不会真正影响函数本身的性能,因为一旦分配,这些方法就没有任何开销。