私は、チームがそれを使用している方法で複数のMercurialリポジトリをより簡単に管理できるようにするために、C#でユーティリティを作成しています。しかし、hg.exeから何かを得る前に、常に約300〜400ミリ秒の遅延があるようです。私はhg.exeとhgtk.exe(TortoiseHgのGUI)を実行するために、以下のコードを使用しています。このコードには現在、ストップウォッチとタイミング目的の変数が含まれています。遅延は、同じセッション内の複数の実行でほぼ同じです。私もhg.exeの正確なパスを指定しようとしましたが、同じ結果が得られました。Mercurial CLIがC#で遅いですか?
static string RunCommand(string executable, string path, string arguments)
{
var psi = new ProcessStartInfo()
{
FileName = executable,
Arguments = arguments,
WorkingDirectory = path,
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardInput = true,
RedirectStandardOutput = true,
WindowStyle = ProcessWindowStyle.Maximized,
CreateNoWindow = true
};
var sbOut = new StringBuilder();
var sbErr = new StringBuilder();
var sw = new Stopwatch();
sw.Start();
var process = Process.Start(psi);
TimeSpan firstRead = TimeSpan.Zero;
process.OutputDataReceived += (s, e) =>
{
if (firstRead == TimeSpan.Zero)
{
firstRead = sw.Elapsed;
}
sbOut.Append(e.Data);
};
process.ErrorDataReceived += (s, e) => sbErr.Append(e.Data);
process.BeginOutputReadLine();
process.BeginErrorReadLine();
var eventsStarted = sw.Elapsed;
process.WaitForExit();
var processExited = sw.Elapsed;
sw.Reset();
if (process.ExitCode != 0 || sbErr.Length > 0)
{
Error.Mercurial(process.ExitCode, sbOut.ToString(), sbErr.ToString());
}
return sbOut.ToString();
}
どのように私は物事をスピードアップできますか?さて、私は、UIのスナップを維持するためにスレッド化に加えて、たくさんのキャッシュを行う必要があるでしょう。
あなたは何かを得る前に遅延があると言いますが、この遅延はプログラムの完了に必要な時間と同じですか?あるいは、任意のコマンドは、プログラムを実行するのに3〜400ミリ秒かかることがありますか?私はhgが遅く動作することを経験したとは言えませんが、出力にはキャッシュがあるようです。言い換えれば、私のプログラムは、hgがそれらを吐き出すと、バッファが何らかの時点で後でいっぱいになったときにだけ、hgからテキストの新しい行を得ることはできないようです。 –
また、私はいくつかの自己商取引をする衝動に抵抗することはできません:)私はMercurialをラップするためのまだ完成していないクラスライブラリを作っています。私のコードをチェックして、プログラムを実行する領域に明らかな違いがないかどうかを調べることができます。私は今、いくつかのタイミングテストをしますが、私のユニットテストはそれほど時間がかかりませんので、私はそんな遅れはないと思います。 http://mercurialnet.codeplex.com/ –
コマンドラインから実行するのにどれくらいの時間がかかるか分かりませんが、26を持っているときに300 + msが受け入れられないということが分かりました。複数のコマンドを実行するリポジトリそれぞれのブランチがどのブランチ上にあるかを知るためには、9秒かかります。また、マージする必要のあるヘッドがあるかどうかをチェックする必要があります。 – Taudris