C++ C++;从文件读取的最佳块大小
我有一个程序,生成包含字符a-Z随机分布的文件。我编写了一个方法,使用具有不同缓冲区大小的fread读取这些文件(并计算每个字符),以尝试确定读取的最佳块大小。方法如下:C++ C++;从文件读取的最佳块大小,c++,file-io,C++,File Io,我有一个程序,生成包含字符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)
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;
}
int get_直方图(文件*fp,长*hist,int块大小,长*毫秒,长*filelen)
{
char*buffer=新字符[块大小];
bzero(缓冲区、块大小);
结构时间b t;
ftime&t;
长启动时间(单位:毫秒)=t.time*1000+t.millitm;
大小\u t字节\u读取=0;
而(!feof(fp))
{
字节读取+=fread(缓冲区,1,块大小,fp);
if(费罗(fp))
{
返回-1;
}
int i;
对于(i=0;i
然而,当我使用2-2^20的块大小绘制字节/秒与块大小(缓冲区大小)的对比时,我得到了4字节的最佳块大小——这是不正确的。我的代码一定有问题,但我找不到
任何建议都将不胜感激
问候
编辑:
本练习的重点是通过记录不同缓冲区大小的读取时间(加上计算时间)来演示最佳缓冲区大小。文件指针由调用代码打开和关闭。您没有说明在什么平台上运行此操作,以及使用什么编译时参数 当然,
fread()
涉及一些开销,离开用户模式并返回。另一方面,您没有直接设置hist[]
信息,而是在字母表中循环。这是不必要的,如果没有优化,会导致每个字节的开销
我会用hist[j-26]++
或类似的东西重新测试这个
通常,如果您的缓冲区大小等于给定媒体的系统缓冲区大小,则可以实现最佳定时。此代码中有许多错误:
- 它不会释放分配的内存
- 它总是循环输入的
字节,而不是block\u size
返回的fread()
bytes\u read
更新:删除了在I/O之前使用
feof()
是错误的声明,因为这不是事实。感谢埃里克在评论中指出这一点。C或C++,它也有内存泄漏。但是<代码>((FEF)(无论如何))<代码>仍然完全被破坏。他可以使用类似于的东西,而((bytes=fread(…)>0){bytes\u read+=bytes;…
谢谢。原来我通过循环计算柱状图受到了巨大的冲击。