现在的位置: 首页 > 综合 > 正文

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

2013年05月04日 ⁄ 综合 ⁄ 共 1111字 ⁄ 字号 评论关闭

在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的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/

抱歉!评论已关闭.