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