0

簡単に言うと、CPUを大量に消費するアプリを再コーディングし、まったく異なる方法で再構築し、内部の動作の多くを変更します。古い結果と新しい結果を比較するための良い方法を探していました。

関数foo()の動作を変更することから始めたとしましょう。

プログラムをたとえば60秒間実行し、プログラムの合計CPU使用率内で関数が使用しているCPUの割合を測定したいと思います。一定の25%である場合、それらの25%のうちどれだけが私の機能であるかを知りたいです。次に、コードを変更した後にテストし、改善があったかどうかを示す2つの良い指標があります。

Very Sleepyを試しましたが、アクセスしたい機能にアクセスできません。それらは表示されません。ライブラリの関数(SDL)を使用するI CODED MYSELF関数の使用率を確認したいのですが、SDL関数しか表示されません。

4

1 に答える 1

3

いくつかの方法がありますが、そのうちの 1 つは、関数の最初と最後に高精度のタイマー呼び出しを追加することです。関数の呼び出し回数に応じて、次のように時間を累積できます。

 typedef type_of_time_source tt;
 tt total = 0;

 void my_func(....)
 {
     tt time = gettime();

     ... lots of your code ... 

     time = gettime() - time;
     total += time;
 }

または、個々の間隔を保存することもできます。

 tt array[LARGE_NUMBER];
 int index = 0;


 ... same code as above ... 
     time = gettime() - time;
     if (index >= LARGE_NUMBER) index = 0; // [or LARGE_NUMBER-1?]
     array[index++] = time;

もちろん、SDL への呼び出しが関数の途中にある場合は、何らかの方法でその時間を割り引く必要があります。

もう 1 つの方法は、いくつかの関数の個々のタイミングを測定することです。

 enum {
     FUNCA,
     FUNCB,
     ....
     MAX_TIMINGS
}

struct timing_val
{
    tt start, end;
    char *name;
}
struct timing_val timing_values[MAX_TIMINGS];

#define START(f)   do { timing_values[f].name = #f; timing_values[f].start = gettime(); } while (0);
#define END(f)  do { timing_values[f].end = gettime(); } while(0);

void report()
{
     for(int i = 0; i < MAX_TIMING; i++)
     {
           if (timing_values[i].start == 0 && timing_vlaues[i].end
                cout << timing_values[i].name <<< " time = " << 
                     timing_values[i].end - timing_values[i].start << endl;
     }
}

void big_function()
{
    START(FUNCA);
    funca();
    END(FUNCA);
    START(FUNCB);
    funcb();
    END(FUNCB)

    ... 

    report();
}

私は確かにこれらすべての関数を使用してきました。関数が適度に大きいため長時間実行されるため、オーバーヘッドが大きくなることはありません。

一度に複数の関数を測定することもできます。たとえば、WHOLE 関数が必要な場合は、上記の列挙型リストに列挙型 "BIG_FUNC" を追加して、次のようにします。

void big_function()
{
    START(BIG_FUNCTION);
    START(FUNCA);
    funca();
    END(FUNCA);
    START(FUNCB);
    funcb();
    END(FUNCB)

    ... 
    END(BIG_FUNCTION);
    report();
}
于 2012-12-31T21:54:02.277 に答える