0

好的,所以我正在将二进制文件读入我用 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++ 速度较慢(只有在您对代码进行基准测试并且需要速度时才会注意到这一点。)

所以

为什么我在这两个应用程序上以相同的速度阅读。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++;
}
4

3 回答 3

1

从或向主内存的传输以每秒千兆字节的速度运行。CPU 内部的数据流动速度更快。毫不奇怪,无论您在软件方面做什么,硬盘本身仍然是瓶颈。

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

  • 硬盘:Samsung HD103SI 5400 rpm:以 80 MB/s 顺序读/写
  • 内存:3 * 2 GB,400 MHz DDR3:读/写大约 2.2 GB/s

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

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

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

于 2009-12-13T12:51:49.957 回答
1

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

低级 IO API(打开、读取、写入、关闭)是无缓冲的,因此使用它会有所不同。

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

于 2009-12-13T13:38:56.693 回答
0

我已经对此进行了一些测试,并且在某个点之后,增加缓冲区大小的效果会随着缓冲区的增大而下降。通常,您可以通过一些试验和错误找到最佳缓冲区大小。

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

于 2009-12-13T12:51:43.533 回答