1

プログラムを出力として書き込むCでプログラムを作成しました。

目的は、モノリシックプログラムのパフォーマンスの側面をテストすることです。

最初のテストは10000回の反復で構成され、結果プログラムはコンパイルされて実行されました。100 000回の反復による2番目のテストは、16 GB RAM(16 GB SWAP)を備えたi73770のUbuntu12.04 x86_64でコンパイル(現在まで3030分)です。

解析の複雑さはO(n ** 2)からO(n ** 3)までですが、これには時間がかかりすぎます。最悪のシナリオでは、コンパイルのタイミングが1000倍になります。

メモリの35.2%を消費していますが、それでも増加しています。

私の質問は:

  • GCCには、モジュールごとの変数の数またはモジュールサイズに制限がありますか?

  • これはバグですか?

元のプログラムジェネレータは次のとおりです。

#include <stdio.h>
#define MAX_INTERACTION 100000

int main(int argc, char **argv)
{
FILE * fp;
fp = fopen("source.c","w");

fprintf(fp,"#include <stdio.h> \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);
}
4

1 に答える 1

1

8GBのメインメモリ(2.3 GHz Intel Core i7)を搭載したMacBookProでタイミングを調整しました。

プログラムサイズを示すパラメーターを取得するようにジェネレーターを変更し、それを繰り返し実行しました。

$ 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 

自家製のGCC4.7.1は、10Kで34.6秒、20Kで150.9秒かかりました。

于 2012-08-15T02:04:58.937 に答える