您的位置:首页 > 编程语言 > C语言/C++

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

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

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

#include <ctime>
using namespace std;
int main()
{
int start=clock();
//Do Something
printf("%.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;
else
numbers[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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: