1

250K 行のファイルを読み込んで、これらの各行に正規表現を適用しようとしています。ただし、コードは Java の readline 関数よりもはるかに低速です。Java ではすべての解析が 10 秒以内に完了しますが、C++ では 2 分以上かかります。相対的なC++ ifstream.getline() が Java の BufferedReader.readLine() よりも大幅に遅いのを見たことがありますか? main の上に次の 2 行を追加しました。

std::ifstream::sync_with_stdio(false);
std::ios::sync_with_stdio(false);

コードの残りの部分 (正規表現が原因である可能性のある遅延を取り除くために単純化しました):

#include "stdafx.h"
#include <ios>
#include <string>
#include <fstream>
#include <iostream>


int _tmain(int argc, _TCHAR* argv[])
{

    std::string libraryFile = "H:\\library.txt";
    std::ios::sync_with_stdio(false);
    std::string line;

    int i = 1;

    std::ifstream file(libraryFile);
    while (std::getline (file, line)) {
        std::cout << "\rStored " << i++ << " lines.";
    }

    return 0;
}

この例は非常に単純に見えますが、ほとんどの投稿で提案されている修正でさえうまくいかないようです。VS2012 でリリース設定を使用して .exe を複数回実行しましたが、Java の時間に到達できません。

4

1 に答える 1

5

速度低下の原因はいくつかあります。

  • cout と cin の混合: C++ IO ライブラリは、cin が使用されるたびに cout を同期する必要があります。これは、入力を求める前に入力プロンプトなどが表示されるようにするためです。これはバッファリングに本当に悪影響を及ぼします。

  • Windows コンソール出力の使用: Windows コンソールは非常に遅く、特に端末エミュレーションの実行中は、面白くありません。可能であれば、代わりにファイルに出力します。

于 2013-06-18T16:24:17.977 に答える