我在C ++(gcc / Linux)中使用std::vector
double
编写了一个简单的高斯消元算法。现在我已经看到运行时取决于编译器的优化级别(使用-O3
最多快5倍)。我写了一个小测试程序并收到了类似的结果。问题不在于矢量的分配,也不是任何调整大小等。
声明:
这是一个简单的事实v[i] = x + y / z;
没有优化,(或类似的东西)会慢得多。我认为问题是索引运算符。如果没有编译器优化,std::vector
比原始double *v
慢,但是当我启用优化时,性能是相同的,令我惊讶的是,即使访问原始double *v
也是如此。更快。
这种行为有解释吗?我真的不是一个专业的开发人员,但我认为编译器应该能够像上面那样直接将语句转移到硬件指令。为什么需要启用优化,更重要的是,优化的缺点是什么? (如果没有,我想知道为什么优化不是标准。)
这是我的矢量测试代码:
const long int count = 100000;
const double pi = 3.1416;
void C_array (long int size)
{
long int start = time(0);
double *x = (double*) malloc (size * sizeof(double));
for (long int n = 0; n < count; n++)
for (long int i = 0; i < size; i++)
x[i] = i;
//x[i] = pi * (i-n);
printf ("C array : %li s\n", time(0) - start);
free (x);
}
void CPP_vector (long int size)
{
long int start = time(0);
std::vector<double> x(size);
for (long int n = 0; n < count; n++)
for (long int i = 0; i < size; i++)
x[i] = i;
//x[i] = pi * (i-n);
printf ("C++ vector: %li s\n", time(0) - start);
}
int main ()
{
printf ("Size of vector: ");
long int size;
scanf ("%li", &size);
C_array (size);
CPP_vector (size);
return 0;
}
我收到了一些奇怪的结果。标准g ++编译为矢量大小为20 000生成运行时8 s(C数组)或18 s(std::vector
)。如果我使用//..
后面更复杂的行,则运行时为8 / 15秒(是的,更快)。如果我打开-O3
那么,对于40,000矢量大小,运行时间为5/5秒。
答案 0 :(得分:5)
为什么我们需要优化/调试版本?
优化可以完全重新排序指令序列,消除变量,内联函数调用,并使可执行代码远离您无法调试的源代码。因此,不使用优化的原因之一是保持调试代码的可能性。当您的代码(当您相信您的代码时)完全调试时,您可以启用优化以生成发布版本。
为什么调试代码会变慢?
怎么做?
您可以尝试展示展示行为的简单可编辑示例。然后我们可以编译并查看程序集来解释实际情况。如果您遇到缓存问题,那么您处理的数据大小非常重要。
<强>链接强>