fread速度管理不受管理

时间:2009-12-13 12:47:21

标签: c++ file-io unmanaged managed

好的,所以我正在将二进制文件读入我用malloc分配的char数组中。 (顺便说一下这里的代码不是实际代码,我只是在现场编写它来演示,所以这里的任何错误都可能不是实际程序中的错误。)这种方法读取大约每秒5000万字节。

char *buffer = (char*)malloc(file_length_in_bytes*sizeof(char));
memset(buffer,0,file_length_in_bytes*sizeof(char));
//start time here
read_whole_file(buffer);
//end time here
free(buffer);

read_whole_buffer

void read_whole_buffer(char* buffer)
{
  //file already opened
  fseek(_file_pointer, 0, SEEK_SET);
  int a = sizeof(buffer[0]);
  fread(buffer, a, file_length_in_bytes*a, _file_pointer);
}

我编写了类似于托管c ++的东西,它使用我相信的文件流和函数ReadByte()来逐字节读取整个文件,并且每秒读取大约5000万字节。

另外,我的计算机上有一个sata和一个IDE驱动器,我从两个文件中加载文件,根本没有任何区别(这很奇怪,因为我假设SATA读了很多比IDE快。)

问题

也许你们都能理解为什么这对我没有任何意义。据我所知,将整个文件放入数组要快得多,而不是逐字节读取。最重要的是,通过测试,我发现托管c ++速度较慢(只有在您对代码进行基准测试并且需要速度时才会注意到。)

SO

为什么我在这个世界上以两种应用程序以相同的速度阅读。还有5000万字节从一个文件到一个数组快速?

也许我的主板是瓶颈我?这似乎没有多大意义。

是否有更快的方法将文件读入数组?

感谢。

我的'脚本计时器'

以毫秒级分辨率记录开始和结束时间......最重要的是计时器

#pragma once
#ifndef __Script_Timer__
    #define __Script_Timer__
    #include <sys/timeb.h>
    extern "C"
    {
        struct Script_Timer
        {
            unsigned long milliseconds;
            unsigned long seconds;
            struct timeb start_t;
            struct timeb end_t;
        };
        void End_ST(Script_Timer *This)
        {
            ftime(&This->end_t);
            This->seconds = This->end_t.time - This->start_t.time;
            This->milliseconds = (This->seconds * 1000) + (This->end_t.millitm - This->start_t.millitm);
        }
        void Start_ST(Script_Timer *This)
        {
            ftime(&This->start_t);
        }  
    }
#endif

读取缓冲区内容

char face = 0;
char comp = 0;
char nutz = 0;
for(int i=0;i<(_length*sizeof(char));++i)
{
    face = buffer[i];
    if(face == comp)
        nutz = (face + comp)/i;
    comp++;
}

3 个答案:

答案 0 :(得分:1)

从主存储器传输或以主存储器传输速度为每秒千兆字节。 CPU内部的数据流速更快。毫无疑问,无论你在软件方面做什么,硬盘驱动器本身仍然是瓶颈。

以下是我的系统中使用PerformanceTest 7.0的一些数字:

  • 硬盘:Samsung HD103SI 5400 rpm:顺序读/写速度为80 MB / s
  • 内存:400 MHz DDR3时3 * 2 GB:读/写约2.2 GB / s

因此,如果您的系统比我的系统稍早,那么50 MB / s的硬盘速度就不足为奇了。与驱动器(IDE / SATA)的连接并非完全相关;它主要是关于每秒通过驱动器磁头的位数,纯粹是硬件。

要记住的另一件事是您的操作系统的文件系统缓存。可能是第二轮,根本没有访问硬盘。

您在评论中提到的180 MB / s内存读取速度看起来有点偏低,但这很可能取决于确切的代码。你的CPU缓存在这里发挥作用。也许您可以发布用于衡量此代码的代码?

答案 1 :(得分:1)

FILE * API使用缓冲流,因此即使您逐字节读取,API也会在内部通过缓冲区读取缓冲区。所以你的比较不会产生很大的不同。

低级别IO API(打开,读取,写入,关闭)是无缓冲的,因此使用此API将有所作为。

如果您不需要自动缓冲FILE * API,它也可能更快!

答案 2 :(得分:0)

我已经对此进行了一些测试,经过一定的时间点后,缓冲区大小越大,缓冲区越大。通常可以通过一些试验和错误找到最佳的缓冲区大小。

另请注意,fread()(或更具体地说是C或C ++ I / O库)可能正在进行自己的缓冲。如果你的系统支持它,普通的read()可能(或可能不会)加快一点。