2

質問があります。ドライブへの書き込みにかかるおおよその時間を実際に測定したいと思います。

私が次のことをするとき:

clock_t begin = clock();
unsigned long long size_t = fwrite(send, 1, transfer_size*sizeof(unsigned long long), wpFile);
clock_t end = clock();
double long elapsed_secs = double long(end - begin) / CLOCKS_PER_SEC;

残念ながら、異なる転送サイズに対して異なる結果は得られません!!!

私の推測では、 clock_t は、 fwrite コマンドを発行すると、何らかの方法で測定を停止し、 fwrite を既に使用しているときに再び戻ってきます。転送サイズが 32KB Byte であろうと 16MB であろうと、ほぼ同じ測定値が得られます。私は実際に大きな違いが見られることを期待していました。正確な実際のタイミング測定は本当に必要ありません(もちろん、知っておくと便利です)。私が気にするのは、KB 転送と MB 転送を行っているかどうかの時間の違いを確認することだけです。

fwrite関数の実際の経過時間を大まかに測定できる他の関数を知っている人はいますか?

4

1 に答える 1

2

問題は、(ほとんどの OS で) ディスクへのすべての書き込みが最初にメモリ内キャッシュに書き込まれることです。これらのキャッシュ ページが古くなりすぎた場合 (通常は 1 秒程度) にのみ、実際にディスクに書き込まれます。

インメモリ キャッシュへの書き込みは非常に高速です。実際のディスク書き込み速度をベンチマークする必要がある場合は、最初にキャッシュを同期する必要があります。

うまくいくかもしれない方法: syncfs()from unistd.h. man 2 syncこの関数は必ずしも同期が行われるのを待つわけではありませんが、「Linux 1.3 以降では実際に待機します」と述べています。

編集: Windows を使用しているとは言いませんでした :) 私は Windows にあまり詳しくありませんが、WINAPI で簡単な Google 検索が表示さFILE_FLAG_NO_BUFFERINGれました。ここここここFlushFileBuffersを見てください。

于 2013-01-24T01:13:04.527 に答える