文字 A ~ Z のランダム分布を含むファイルを生成するプログラムがあります。読み取りに最適なブロック サイズを決定するために、さまざまなバッファー サイズで fread を使用してこれらのファイルを読み取る (および各文字をカウントする) メソッドを作成しました。メソッドは次のとおりです。
int get_histogram(FILE * fp, long *hist, int block_size, long *milliseconds, long *filelen)
{
char *buffer = new char[block_size];
bzero(buffer, block_size);
struct timeb t;
ftime(&t);
long start_in_ms = t.time * 1000 + t.millitm;
size_t bytes_read = 0;
while (!feof(fp))
{
bytes_read += fread(buffer, 1, block_size, fp);
if (ferror (fp))
{
return -1;
}
int i;
for (i = 0; i < block_size; i++)
{
int j;
for (j = 0; j < 26; j++)
{
if (buffer[i] == 'A' + j)
{
hist[j]++;
}
}
}
}
ftime(&t);
long end_in_ms = t.time * 1000 + t.millitm;
*milliseconds = end_in_ms - start_in_ms;
*filelen = bytes_read;
return 0;
}
ただし、2 から 2^20 のブロック サイズを使用してバイト/秒とブロック サイズ (バッファー サイズ) をプロットすると、4 バイトの最適なブロック サイズが得られます。これは正確ではありません。コードに何か問題があるはずですが、見つかりません。
アドバイスをいただければ幸いです。
よろしく。
編集:
この演習のポイントは、さまざまなバッファー サイズの読み取り時間 (および計算時間) を記録して、最適なバッファー サイズを示すことです。ファイル ポインターは、呼び出し元のコードによって開かれ、閉じられます。