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++ 実装よりもはるかに高速です (約 230k の数値を格納する 3MB ファイルの約 1500 ミリ秒と比較して 230 ミリ秒):

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

簡単にするために、ループ内のデータ操作関数は省略しましたが、これらの「生の」例でさえ、C 型 I/O のほぼ 7 倍の拡張を示しています。なぜこれほど大きなパフォーマンスの違いがあるのでしょうか? C++ ストリーム/関数を使用して、これらの種類のファイルをより高速に読み取る方法はありますか?

4

2 に答える 2

3

C と C++ のコードに大きな違いがある場合は、最適化を使用してコンパイルしていない可能性があります。-O3またはコンパイラが最適化を有効にするために必要なフラグを使用してみてください。最適化されていないコードの速度を測定することは、コードの複雑さよりも言語の複雑さについて多くのことを教えてくれるため、一般的に無意味です。特に C++ は、適切なパフォーマンスを得るために最適化に大きく依存しています。

于 2012-08-17T17:37:28.163 に答える
-2

バッファに関連している可能性があります。関数ごとに ifstream に十分なバッファを設定してみてください。

file.rdbuf()->pubsetbuf()

これにより、ディスク IO とシステム コールが削減されます。(バッチモードで読み込み)

于 2012-08-17T17:58:54.423 に答える