2016-09-03 5 views
3

ファイルに対して動作するアルゴリズムをベンチマークします。このアルゴリズムはN回の繰り返しを繰り返し、各ラウンドでは1つのデータブロックを読み込み、魔法のことを行い、次のブロックのオフセットを設定します。私は、オペレーティングシステムが温かくキャッシュと冷たいキャッシュを持って知っているCでバッファリングせずにファイルを開いて読み込む方法は?

int run_algorithm(int offset) { 

    char *fname = "database.dat"; 
    fd = open(fname, O_RDONLY); 

    // read the desired block to memory 
    block_size = 1024 * 1024; 
    char *buf = malloc(block_size); 
    lseek(fd, offset, SEEK_SET); 
    read(fd, &buf, block_size); 

    int new_offset; 
    // do magic stuff with buf 
    // and set a new offset 

    close(fd); 
    return new_offset; 
} 

int main() { 

    int i; 

    //init offset 
    int offset = 0; 

    // iterate N times 
    for (i = 0; i < N; i++) { 
     offset = run_algorithm(offset); 
    } 

    return 0; 
} 

は、ここで擬似コードです。私は、コールドキャッシュのケースを実装したいと思います。各run_algorithm()呼び出しでは、ファイルが開いているときにバッファリングが行われません。つまり、ファイルの一部をオペレーティングシステムによってメモリのどこかに格納してopen()とseek()を高速化する必要はありません。

バッファリングなしでopen()とseek()を特別に設定する方法はありますか?

+3

いいえ、OSにバッファリングしないように指示しても、ドライブコントローラまたはオンボードディスクキャッシュが影響を受けているかどうかわかりません。 –

+0

Linuxボックスを使用していますか?もしそうなら、あなたは 'open()'呼び出しで 'O_DIRECT'を使うことができますか?これにより、少なくとも書き込み操作中にシステムによって行われるキャッシングの量が減少する可能性があります。しかし、あなたは機密性の高い分野に属しており、ディスクデータが確実にキャッシュされるように、システムは異常な長さになります。 –

+0

あなたのファイルを 'main'で開き、' FILE * fp'パラメータを 'run_algorithm'に渡して、ファイルを繰り返し開いたり閉じたりしないのはなぜですか? 'for'ループを' run_algorithm'に移動し、 'int'(または配列のアドレス)を' run_algorithm'に渡してオフセットの配列を作成し、 'run_algorithm'が配列へのポインタを返すようにします(関数へのポインタとして渡された配列を使うことができるだけでなく)。 –

答えて

3

ハードドライブとオペレーティングシステムでalllキャッシュを無効にすることはできません。

しかし、あなたはあなたのプログラムの外だあなたのベンチマークすべてが、あなたがCランタイムライブラリにバッファリングを無効にすることができますことを受け入れる場合:

setvbuf(fd, NULL, _IONBF, 0); 

あなたはfopenの操作後すぐに関数を呼び出す必要があります。 cpp reference pageの詳細を参照してください。

関連する問題