c++ - fread 速度管理非托管

标签 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);

读取整个缓冲区

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 更快。)

问题

也许你们都能理解为什么这对我来说没有任何意义。据我所知,将整个文件 fread 成一个数组应该比逐字节读取要快得多。最重要的是,通过测试我发现托管 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
  • 内存:3 * 2 GB,400 MHz DDR3:读/写速度约为 2.2 GB/秒

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

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

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

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

相关文章:

c++ - 为什么我们在 visual studio 中写 #include<iostream> 和 #include<conio.h>

c++ - 使用成员函数时使用 std::result_of 编译失败

c++ - C 风格、C++ 流或 Win32 API 文件 I/O?

visual-studio - 为什么非托管导出示例在棱镜XE中不起作用

c# - 从 VTable 调用结构中的非托管函数

python - Ctypes:分配 double** ,将其传递给 C,然后在 Python 中使用

C++ MPI,使用多个节点,首先在节点级别减少,然后减少到头节点

Java 从文件中读取二维数组

c# - 在 .net 中将数据保存到文件时的良好编码习惯

C++/命令行界面 : Why is there no Managed->Unmanaged transition in this scenario?