首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非管理的读取速度管理

非管理的读取速度管理
EN

Stack Overflow用户
提问于 2009-12-13 12:47:20
回答 2查看 1.3K关注 0票数 0

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

main

代码语言:javascript
复制
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

代码语言:javascript
复制
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++编写了类似的东西,它使用filestream (我相信)和函数ReadByte()逐字节读取整个文件,它每秒读取5000万字节。

另外,我的电脑里有一个sata和一个IDE驱动器,而且我已经把这两个文件都加载掉了,这一点也没有什么区别(这很奇怪,因为我假设SATA读取的速度比IDE快得多)。

问题

也许你们都能理解为什么这对我来说毫无意义。据我所知,将整个文件读入数组应该要快得多,而不是逐字节读取它。最重要的是,通过测试,我发现托管c++速度更慢(不过,如果您正在对代码进行基准测试,并且需要速度,这是值得注意的)。

所以

为什么我在世界上以同样的速度阅读这两种应用程序。也是5000万字节从一个文件,变成一个数组快速?

也许我的主板正把我塞进瓶子?这似乎没有多大意义。

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

谢谢。

我的“脚本定时器”

用毫秒resolution...Most记录开始和结束时间,重要的是它是而不是一个计时器

代码语言:javascript
复制
#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

读缓冲器

代码语言:javascript
复制
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++;
}
EN

回答 2

Stack Overflow用户

发布于 2009-12-13 13:38:56

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

低级别的IO (打开、读、写、关闭)是不缓冲的,所以使用这个API会产生不同的效果。

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

票数 1
EN

Stack Overflow用户

发布于 2009-12-13 12:51:43

我已经对此做了一些测试,在某个点之后,缓冲区越大,缓冲区大小越大的影响就越小。通常有一个最佳的缓冲区大小,您可以通过一些尝试和错误。

还请注意,fread() (或者更具体地说,是C或C++ I/O库)可能正在进行自己的缓冲。如果您的系统支持它,那么纯文本read()可能(或者不)会更快一些。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1896404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档