検索しましたが、必要なものが正確に見つからないようです。
次のコマンドを実行するのと同等の高速な C++ を探しています。
diff file1.log file2.log | wc -l
現在、コマンド ラインから diff を実行するためにファイル パイプを使用していますが、これを複数のネストされた大規模なループで実行する必要があり、予想よりもかなり時間がかかります。差分をとるファイルはそれぞれ約 150 ~ 200 MB で、各差分には約 1 ~ 2 分かかります。
C++ でロールできる高速なソリューションはありますか?
それを呼び出す私の現在の方法は次のとおりです。
static std::string run_cmd(std::string in)
{
// run command
FILE* pipe = popen(in.c_str(), "r");
if (!pipe) return "err";
char buff[128];
std::string res = "";
while (!feof(pipe))
{
if (fgets(buff, 128, pipe) != NULL)
res += buff;
}
pclose(pipe);
return res;
}
// diff 2 given files and return line number differences
std::string fileDiff(std::string file1, std::string file2)
{
std::string f1 = base + file1;
std::string f2 = base + file2;
std::string cmd = "diff " + f1 + " " + f2 + " | wc -l";
std::string res = run_cmd(cmd);
if (res == "err")
return "E: Diff on [" + f1 + "] and [" + f2 + "]";
return res;
}
編集:
私が本質的に行っているのは、コード カバレッジのログです。作業しているコードベースの隅々までロギング ステートメントを挿入し、それぞれの実行を独自のログ ファイルに書き込みます。コンストラクターやループなどに含めないことで書き込みのペナルティを最小限に抑えようとし、実際の書き込みプロセスをバッファーに入れました。
私が持っていたプログラムは通常、実行に約 10 分かかりました。ロギングと差分呼び出しを追加すると、約 1 日程度にスケールアップされます。
この場合、遺伝的アルゴリズムで適合度関数を供給しているため、行の違いの量だけを気にします。この時点では、反復間の実行パスの広がりが重要です。