我刚开始使用一大堆代码,作者声称这些代码“高度优化”。在某些时候他们这样做:
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;
}
期望性能下降是否合理?换句话说,很明显,在许多不同的系统和编译器中,作者的优化(使用全局数组而不是函数内部的数组)将有助于提高性能?
答案 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关键字)。但是,所有这些假设都不会真正影响函数本身的性能,因为一旦分配,这些方法就没有任何开销。