2

これはクラス プロジェクト用であることを最初に認めておきます。ファイルシステムのブロックサイズを調べるために読み取りを行うことになっています。私の問題は、これを行うのにかかる時間が直線的に増加しているように見え、期待するような手順がないことです.

私は次のように読み取りのタイミングを計っています:

double startTime = getticks();
read = fread(x, 1, toRead, fp);
double endTime = getticks();

getticks は rdtsc 命令を使用します。fread 中に読み取りに時間がかからない原因となっているキャッシング/プリフェッチがあるのではないかと心配しています。プログラムを実行するたびにランダムファイルを作成しようとしましたが、問題が軽減されません。

ディスクからの読み取りにかかった時間を正確に測定する最良の方法は何ですか? ブロック サイズが 4096 であることは確かですが、それをサポートするデータを取得するにはどうすればよいですか?

4

2 に答える 2

2

ファイルシステムのブロックサイズを決定する通常の方法は、ファイルシステムにそのブロックサイズを尋ねることです。

#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)カーネルのバッファーキャッシュをバイパスさせようとする場合 (保証されません)。

于 2009-09-29T17:38:25.080 に答える
1

システムコール ( open()read()write()、 ...) を直接使用して、FILE*スタッフによって行われるバッファリングの影響を減らすことができます。また、何らかの方法で同期 I/O を使用することもできます。O_SYNC1つの方法は、フラグを設定して(またはO_DIRECTephemientの返信に従って)ファイルを開くことです。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.

別のオプションは、( (8)-o syncを参照) を使用してファイルシステムをマウントするか、 (1) コマンドを使用してファイルに属性を設定することです。mountSchattr

于 2009-09-29T19:45:30.270 に答える