4

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

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; 
}

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

4

3 回答 3

2

由于数字很重要:

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

./trial.out 59.40s user 0.00s system 99% cpu 59.556 total

源代码: 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

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

于 2012-05-05T18:58:54.417 回答
1

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

于 2012-05-06T19:27:00.977 回答
0

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

于 2012-05-05T18:53:43.600 回答