2012-08-17 85 views
1

我正在处理一个小程序,处理相当大(4-5 MB),矩阵形(数字值存储为N * M行和列)ASCII文件:一种有效的方法来读取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毫秒相比〜1500毫秒存储大约3MB文件230k数值):

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

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

+0

http://stackoverflow.com/questions/605839/c-and-c-file-io – 2012-08-17 15:11:24

+0

http://stackoverflow.com/questions/1924530/mixing-cout-and-printf为更快的输出 http://stackoverflow.com/questions/1736267/c-cout-printing-slowly – BoBTFish 2012-08-17 15:12:46

+0

是230ms足够快为您?如果是这样,是否有你不想使用'fscanf'的理由? – 2012-08-17 16:15:41

回答

3

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

-1

这可能涉及到缓冲区,尝试通过功能可为您的ifstream的足够的缓冲区:

file.rdbuf()->pubsetbuf()

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

+0

投票是为了什么原因? – 2012-08-17 22:38:56

相关问题