探寻C++最快的读取文件的方案

来源:互联网 发布:科比职业生涯数据 编辑:程序博客网 时间:2024/05/27 00:47

在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。一个进阶的方法是把数据一下子读进来,然后再转化字符串,这种方法传说中很不错,但具体如何从没试过,因此今天就索性把能想到的所有的读数据的方式都测试了一边,结果是惊人的。

竞赛中读数据的情况最多的莫过于读一大堆整数了,于是我写了一个程序,生成一千万个随机数到data.txt中,一共56MB。然后我写了个程序主干计算运行时间,代码如下:

#include <ctime>using namespace std;int main(){int start=clock();//Do Somethingprintf("%.3lf\n",double(clock()-start)/CLOCKS_PER_SEC);return 0;}

最简单的方法我想到的是使用ifstream类对象来读文件,代码如下:

住:没有加文件打开是否成功的判断,只是为了更专注读文件的效率

#include <fstream>const int MAXN = 10000000;int numbers[MAXN];void ifstream_read(){ifstream ifs_read("data.txt");for(int i=0; i!= MAXN;; ++i)ifs_read>>numbers[i];ifs_read.close();}

可是效率如何呢?在我的电脑windows平台上测试结果是50.024s。

接下来使用fread来读取文件的整型数据:

#include <stdio.h>const int MAXN=10000000;const int MAXS = 60*1024*1024;int numbers[MAXN];char buf[MAXS];void analyse(char *buf,int len = MAXS){int i;numbers[i=0]=0;for (char *p=buf;*p && p-buf<len;p++)if (*p == ' ')numbers[++i]=0;elsenumbers[i] = numbers[i] * 10 + *p - '0';}void fread_analyse(){FILE* fd=fopen("data.txt","r");int len=fread(buf,1,MAXS,fd);fclose(fd);buf[len]=0;analyse(buf,MAXS);}

测试后,测试结果是1.024s,是快了许多。

资料参考:

https://www.byvoid.com/blog/fast-readfile/

原创粉丝点击