好的,因此我正在将二进制文件读入已使用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++;
}

最佳答案

主内存之间的传输以每秒千兆字节的速度运行。在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的缓存在这里起作用。也许您可以发布用于测量此代码的代码?

关于c++ - fread速度托管不托管,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1896404/

10-16 02:12