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