1

我正在开发一个处理相当大(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 毫秒,而 3MB 文件存储大约 230k 数值的约 1500 毫秒):

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

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

4

2 回答 2

3

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

于 2012-08-17T17:37:28.163 回答
-2

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

文件.rdbuf()->pubsetbuf()

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

于 2012-08-17T17:58:54.423 回答