4

gprof コマンドを使用しようとしgprof -s executable.exe gmon.out gmon.sumています。プログラムを 2 回実行して収集したプロファイリング データをマージします。しかし、次のエラーが表示されます。

gprof: 合計 196608 バイトの後に 3403207348 バイトを割り当てるメモリが不足しています

私のプログラムは非常に単純です (1 つのforループのみ)。一度実行すると、gprof が記録するには実行時間が短すぎます (0.00 秒と表示されます)。

CygWin では、次の手順を実行します。

  1. gcc -pg -o fl forAndWhilLoop.c

  2. fl (プログラムを実行)

  3. mv gmon.out gmon.sum

  4. fl (プログラムを実行)

  5. gprof -s fl.exe gmon.out gmon.sum

  6. gprof fl.exe gmon.sum>gmon.out

  7. gprof fl.exe

私のプログラム:

int main(void)
{
    int fac=1;
    int count=10;
    int k;

    for(k=1;k<=count;k++)
    {
        fac = fac * k;
    }

    return 0;
}

誰でもこの問題で私を助けることができますか?ありがとう!

4

2 に答える 2

0

時間を計るだけなら、私のマシンでは105nsです。コードは次のとおりです。

void forloop(void){ 
    int fac=1; 
    int count=10; 
    int k; 

    for(k=1;k<=count;k++) 
    { 
        fac = fac * k; 
    } 
} 

int main(int argc, char* argv[])
{
    int i;
    for (i = 0; i < 1000000000; i++){
        forloop();
    }
    return 0;
}

アイデアを得ますか?ハンドヘルドストップウォッチを使用しました。10^9 回実行されるため、秒 = ナノ秒です。

このように内側のループを展開すると、時間が92nsに短縮されました。

int k = 1;
while(k+5 <= count){
    fac *= k * (k+1) * (k+2) * (k+3) * (k+4);
    k += 5;
}
while(k <= count){
    fac *= k++;
}

Debug から Release ビルドに切り替えると、21nsになりました。この種の高速化は、実際のホットスポットでのみ期待できます。

于 2010-02-04T15:50:41.310 に答える