2つの方法を使用して、同じテキストのx行をファイルに書き込むという簡単なベンチマークを実行しています。
直接fwrite。
新しいスレッドを作成し、通信は非同期キューを介して行われます(メインスレッドは一方の側に挿入され、もう一方のスレッドはもう一方の側から読み取られます)。このメソッドは、(フラッシングによる)最も遅い書き込みを最小限に抑えるために使用されます
これは、プログラムの基本的な考え方を示すコードのスニペットです。
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 全体の所要時間ではなく、特定の関数の最小、最大、平均の実行時間を提供するツールを探しています。