0

2つの方法を使用して、同じテキストのx行をファイルに書き込むという簡単なベンチマークを実行しています。

  1. 直接fwrite。

  2. 新しいスレッドを作成し、通信は非同期キューを介して行われます(メインスレッドは一方の側に挿入され、もう一方のスレッドはもう一方の側から読み取られます)。このメソッドは、(フラッシングによる)最も遅い書き込みを最小限に抑えるために使用されます

これは、プログラムの基本的な考え方を示すコードのスニペットです。

int i;
char * buf;
int buf_size;
double local_start, local_end, global_start, global_end;
double slowest, fastest;
double local_time_difference;

buf = "A string to be printed to a file \n";
buf_size = strlen(buf);
fastest = MAX_WRITE_TIME;
slowest = 0;

logger_init(atoi(argv[1]));


global_start = get_time();
for(i = 0 ; i < 100000000 ; i++) 
{
    local_start = get_time();
    logger_write(buf, buf_size);
    local_end = get_time();

    local_time_difference = local_end-local_start;

    if(local_time_difference < fastest && local_time_difference != 0)
        fastest = local_time_difference;

    if(local_time_difference > slowest)
        slowest = local_time_difference;

    if(i % 10000 == 0)
        usleep(1);
}   
global_end = get_time();



printf("Fastest: %1.9f\nSlowest: %1.9f\nTotal Time: %1.9f\n", fastest, slowest, global_end-global_start);
logger_destroy();

Get timeプロシージャは、マイクロ秒単位で時間を返します

double get_time()
{
    struct timeval t;
    struct timezone tzp;
    gettimeofday(&t, &tzp);
    return t.tv_sec + t.tv_usec*1e-6;
}

logger_initに渡された引数に応じて、logger_writeはファイルに直接書き込むか、キューに挿入します(キューのサイズは特定の制限を超えてはなりません)。GAsyncQueueが使用されています

私が現在最も速い書き込みと最も遅い書き込みを計算するために使用している方法は確かに機能しますが、私の質問は次のとおりです。これを行うツールまたはプロファイラーはありますか?つまり、各関数に関する統計を教えてください(最大、最小、平均の呼び出し)

私がこれまで試したが運がなかったツール:

  • gprof
  • ズーム
  • Kcachegrind
  • VTune

TL:DR 全体の所要時間ではなく、特定の関数の最小、最大、平均の実行時間を提供するツールを探しています。

4

1 に答える 1

0
  • ベンチマークには、正しい高解像度 OS API 関数を使用してください。
  • 特に浮動小数点数を使用している場合は、測定自体の内部から実行時間を計算しないでください。
  • なぜスリープ機能を呼び出すのですか?コンテキストの切り替えまたはそのような奇妙なことを強制しようとしていますか? OS は、プログラムよりも優れた効率的な処理を行う可能性があります。
于 2012-07-04T11:36:42.570 に答える