我有一个程序可以生成包含字符 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 个字节的最佳块大小——这是不正确的。我的代码一定有问题,但我找不到。
任何建议表示赞赏。
问候。
编辑:
本练习的重点是通过记录不同缓冲区大小的读取时间(加上计算时间)来演示最佳缓冲区大小。文件指针由调用代码打开和关闭。