C 用“初始化数组”;“静态”;更改运行时?
我注意到,在使用O3优化编译之后,在C中初始化数组的两种不同方法似乎会导致运行时间的差异。下面是一个复制这种差异的最小(尽管毫无意义)示例:C 用“初始化数组”;“静态”;更改运行时?,c,arrays,gcc,C,Arrays,Gcc,我注意到,在使用O3优化编译之后,在C中初始化数组的两种不同方法似乎会导致运行时间的差异。下面是一个复制这种差异的最小(尽管毫无意义)示例: #include <stdio.h> #include <time.h> int main(void) { int i, j, k; int size=10000; int a[size]; clock_t time1 = clock(); for (i=0; i<size; i++)
#include <stdio.h>
#include <time.h>
int main(void) {
int i, j, k;
int size=10000;
int a[size];
clock_t time1 = clock();
for (i=0; i<size; i++) {
for (j=0; j<300000; j++) {
for (k=0; k<700000; k++) {
a[i] = j+k;
}
}
}
clock_t time2 = clock();
double time = (double)(time2-time1)/CLOCKS_PER_SEC*1000.0;
printf("%f\n", time);
getchar();
return 0;
}
#包括
#包括
内部主(空){
int i,j,k;
int size=10000;
int a[大小];
时钟时间1=时钟();
对于(i=0;i我认为这在很大程度上取决于编译器。当存在静态时,我的GCC 5.4完全删除了循环,可能是因为它可以计算出计算没有副作用(“死代码消除”)。由于某种原因,当存在VLA时,它无法做到这一点(这是缺少的优化)
作为旁注,为了可靠地度量性能,您需要防止编译器进行过多优化
void __attribute__((noinline, noclone)) benchmark(int *a, int size) {
for (i=0; i<size; i++)
for (j=0; j<300000; j++)
for (k=0; k<700000; k++)
a[i] = j+k;
}
int main(void) {
int i, j, k;
int size=10000;
int a[size];
clock_t time1 = clock();
benchmark(a, size);
clock_t time2 = clock();
double time = (double)(time2-time1)/CLOCKS_PER_SEC*1000.0;
printf("%f\n", time);
getchar();
return 0;
}
void\uuuuu属性(noinline,noclone))基准测试(int*a,int size){
对于(i=0;i您更改为静态,并使用了一个常量而不是您显示的VLA代码。您更改了两件事,谁知道哪件事可能会有不同?使用-S
编译并查看程序集。@RetiredInja感谢您指出这一点。如果我使用“static int a[size];”(即,使用变量名而不是常量10000),然后我得到错误“a的存储大小不是常量”。这就是我为什么要“static int a[10000];@user3386109您能告诉我要查找什么吗?谢谢!static
不是初始化器。谢谢,这很有帮助!