读取ASCII文件的有效方法

时间:2012-08-17 15:08:14

标签: c++ c

我正在开发一个小程序,处理相当大的(4-5 MB)矩阵形状(数值存储为N * M行和列)ASCII文件:

1 2 3
4 5 6
7 8 9
etc.

我注意到旧式C文件输入法:

csFile = fopen("file.dat","r");
while(fscanf(csFile, "%lf", &Point)!=EOF) {
}
fclose(csFile);

比最基本的C ++实现快得多(230 ms,相比之下,对于存储大约230k数值的3MB文件,~1500 ms):

ifstream myfile ("file.dat");
while(myfile >> Point) {
}
myfile.close();

为简单起见,我省略了循环内部的数据操作函数,但即使这些“裸”示例也显示C类型I / O的几乎七倍的增强。为什么会出现如此巨大的性能差异?有没有更快的方法来使用C ++流/函数读取这些类型的文件?

2 个答案:

答案 0 :(得分:3)

如果您在C和C ++代码之间看到如此巨大的差异,我怀疑您没有使用优化进行编译。尝试使用-O3或编译器需要的任何标志来启用优化。测量未经优化的代码的速度通常是毫无意义的,因为它告诉您更多关于语言的复杂性而不是代码的复杂性。特别是C ++非常依赖于优化来获得合理的性能。

答案 1 :(得分:-1)

它可能与缓冲区有关,尝试通过函数为ifstream设置足够的缓冲区:

file.rdbuf()->pubsetbuf()

这会减少磁盘IO和系统调用。 (以批处理模式阅读)