C++ C++;从文件读取的最佳块大小

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)

我有一个程序,生成包含字符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;
}
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]++
或类似的东西重新测试这个


通常,如果您的缓冲区大小等于给定媒体的系统缓冲区大小,则可以实现最佳定时。

此代码中有许多错误:

    使用<代码> NeX[]/COD>,C++,
  • 它不会释放分配的内存
  • 它总是循环输入的
    block\u size
    字节,而不是
    fread()
    返回的
    bytes\u read
此外,实际的直方图代码效率相当低,因为它似乎会循环遍历每个字符以确定它是哪个字符


更新:删除了在I/O之前使用
feof()
是错误的声明,因为这不是事实。感谢埃里克在评论中指出这一点。

C或C++,它也有内存泄漏。但是<代码>((FEF)(无论如何))<代码>仍然完全被破坏。他可以使用类似于
的东西,而((bytes=fread(…)>0){bytes\u read+=bytes;…
谢谢。原来我通过循环计算柱状图受到了巨大的冲击。