gcc模块大小限制

我在C中创建了一个程序,它将程序作为输出。

目标是测试整体程序中的性能方面。

第一个测试配置了10 000次迭代,结果程序编译并运行。 在Ubuntu 12.04 x86_64中,在具有16 GB RAM(16 GB SWAP)的i7 3770中编译具有100 000次迭代的第二次测试(直到现在为3030分钟)。

我知道解析复杂度从O(n ** 2)到O(n ** 3),但这需要太长时间。 在最糟糕的情况下,编译时间增加1000倍。

消耗35.2%的内存仍然增加。

我的问题是:

  • GCC是否对每个模块或模块大小的变量数量有限制?

  • 这是一个错误吗?

原始程序生成器是:

#include  #define MAX_INTERACTION 100000 int main(int argc, char **argv) { FILE * fp; fp = fopen("source.c","w"); fprintf(fp,"#include  \n \n \n"); fprintf(fp,"int main(int argc, char **argv) \n"); fprintf(fp,"{ \n"); // local variables and exchange variables for (int i=0; i< MAX_INTERACTION ; ++i) { // passed variable, return label , local variable fprintf(fp," int pv%d , rl%d, loc%d ; \n",i,i,i); } fprintf(fp," int pvd =0 ;\n \n \n"); //code blocks for (int i=0; i< MAX_INTERACTION ; ++i) { fprintf(fp," block%d : \n",i); fprintf(fp," loc%d = pv%d +1 ; \n",i,i); fprintf(fp," goto rl%d; \n",i); } //call blocks for (int i=1; i< MAX_INTERACTION +1; ++i) { fprintf(fp," pvd = pv%d ;\n",(i-1)); fprintf(fp," goto block%d; \n",(i-1)); fprintf(fp," rl%d: \n",(i-1)); } fprintf (fp,"printf( \"Concluido \\n \"); \n"); fprintf(fp,"}\n"); fclose(fp); } 

我在具有8 GB主内存(2.3 GHz Intel Core i7)的MacBook Pro上做了一些计时。

修改生成器以获取指示程序大小的参数,然后重复运行:

 $ for size in 10 100 1000 2000 3000 4000 5000 10000 20000 30000 > do > ./generator $size > echo $size > time make -s source 2>/dev/null > sleep 1 > done 10 real 0m0.526s user 0m0.030s sys 0m0.029s 100 real 0m0.084s user 0m0.031s sys 0m0.018s 1000 real 0m0.333s user 0m0.235s sys 0m0.044s 2000 real 0m0.392s user 0m0.318s sys 0m0.046s 3000 real 0m0.786s user 0m0.661s sys 0m0.070s 4000 real 0m0.657s user 0m0.599s sys 0m0.053s 5000 real 0m0.978s user 0m0.893s sys 0m0.069s 10000 real 0m3.063s user 0m2.770s sys 0m0.149s 20000 real 0m8.109s user 0m7.315s sys 0m0.274s 30000 real 0m21.410s user 0m19.553s sys 0m0.483s $ 

很明显,在小尺寸的情况下,只需简单地运行编译器(特别是第一次运行!),读取和写入文件等,就会有开销。重复10,000到90,000的倍数,我得到了下表中的结果。 减速是可观的,特别是在20,000到30,000之间。 对于任何给定的尺寸,我在时间上也有相当大的变化。 并且使代码可配置,然后在遇到问题时以递增方式运行只是明智的。

  Compared to 10K Size Time Size Ratio Time Ratio Log Time Ratio 10K 3.7 1.00 1.00 0.000 20K 8.1 2.00 2.19 0.784 30K 25.1 3.00 6.78 1.915 40K 45.2 4.00 12.22 2.503 50K 76.7 5.00 20.73 3.032 60K 110.5 6.00 29.96 3.397 70K 176.0 7.00 47.57 3.862 80K 212.0 8.00 57.30 4.048 90K 292.3 9.00 79.00 4.369 100K 363.3 10.00 98.19 4.587 

当然,你的里程会有所不同。

作为参考,我使用的GCC是:

 i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.9.00) 

编译命令行是:

 /usr/bin/gcc -O3 -g -std=c99 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes \ -Wold-style-definition source.c -o source 

自制的GCC 4.7.1在10K时为34.6秒,在20K时为150.9秒。