質問
私が最初にそれはかなり明白になりますので、これは、クラスのプロジェクトのためのものであることを認めるつもりです。私たちは、ファイルシステムのブロックサイズのために調べるために読み行うことになっています。私の問題は、これを行うために要する時間は、直線的に私が期待するような段差なしで、増加しているように見えるということです。
私はこのような読み取りタイミングいます:
double startTime = getticks();
read = fread(x, 1, toRead, fp);
double endTime = getticks();
getticksは、RDTSC命令を使用する場所。私は、関数freadの間に時間がかかるしないように読み込むの原因となっているキャッシュ/プリフェッチがあるかと思います。私は、各実行私のプログラムの間でランダムなファイルを作成しようとしたが、それは私の問題を軽減されていません。
正確にディスクからの読み込みにかかる時間を計測するための最良の方法は何ですか?私は私のブロックサイズは4096であるかなり確信しているが、私は、データを取得することができますどのようにそれをサポートするために?
解決
あなたは、システムコールを使用することもできます(open()
、read()
、write()
、...)
直接FILE*
スタッフによって行わバッファリングの影響を低減します。
また、あなたは何とか同期I / Oを使用することもできます。
一つの方法はO_SYNC
フラグを設定してファイルを開いています
(またはO_DIRECT
ephemientの回答によります)。
Linux open
を引用(2)マニュアルページ:
O_SYNC The file is opened for synchronous I/O. Any write(2)s on the
resulting file descriptor will block the calling process until
the data has been physically written to the underlying hardware.
But see NOTES below.
もう一つのオプションは-o sync
でファイルシステムをマウントする((8)mount
を参照)またはS
(1)コマンドを使用してファイルにchattr
属性を設定することでしょう。
他のヒント
ファイルシステムのブロックサイズを決定する通常の方法は、そのブロックサイズが何であるか、ファイルシステムを依頼することです。
#include <sys/statvfs.h>
#include <stdio.h>
int main() {
struct statvfs fs_stat;
statvfs(".", &fs_stat);
printf("%lu\n", fs_stat.f_bsize);
}
しかし、あなたが本当にしたい場合は、 open(…,…|O_DIRECT)
のか、 posix_fadvise(…,…,…,POSIX_FADV_DONTNEED)
するあなたは、カーネルのバッファキャッシュ(保証されません)をバイパスできるようにしようとします。