2010-12-29 4 views
1

私は、チームがそれを使用している方法で複数の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のスナップを維持するためにスレッド化に加えて、たくさんのキャッシュを行う必要があるでしょう。

+0

あなたは何かを得る前に遅延があると言いますが、この遅延はプログラムの完了に必要な時間と同じですか?あるいは、任意のコマンドは、プログラムを実行するのに3〜400ミリ秒かかることがありますか?私はhgが遅く動作することを経験したとは言えませんが、出力にはキャッシュがあるようです。言い換えれば、私のプログラムは、hgがそれらを吐き出すと、バッファが何らかの時点で後でいっぱいになったときにだけ、hgからテキストの新しい行を得ることはできないようです。 –

+0

また、私はいくつかの自己商取引をする衝動に抵抗することはできません:)私はMercurialをラップするためのまだ完成していないクラスライブラリを作っています。私のコードをチェックして、プログラムを実行する領域に明らかな違いがないかどうかを調べることができます。私は今、いくつかのタイミングテストをしますが、私のユニットテストはそれほど時間がかかりませんので、私はそんな遅れはないと思います。 http://mercurialnet.codeplex.com/ –

+0

コマンドラインから実行するのにどれくらいの時間がかかるか分かりませんが、26を持っているときに300 + msが受け入れられないということが分かりました。複数のコマンドを実行するリポジトリそれぞれのブランチがどのブランチ上にあるかを知るためには、9秒かかります。また、マージする必要のあるヘッドがあるかどうかをチェックする必要があります。 – Taudris

答えて

2

さて、ここでは取引があります。

水銀コマンドラインプログラムにはオーバーヘッドが含まれています。

このコマンド:

hg --quiet version 

まったくのリポジトリを見ていない、実行するために私のマシン上で、平均で195msかかります。リポジトリとチェンジセットの使用を開始するときに、これをゼロに近づけることを最小限に抑えることはできません。

なぜ26のレポジトリがありますか?なぜあなたは彼らがどこにいるのか知る必要がありますか?同時に名前付きブランチと複数のリポジトリを使用していますか?

+0

はい、複数のリポジトリと名前付きブランチを使用しています。コードはいくつかのライブラリに分割され、異なるプロジェクト間でさまざまな組み合わせで使用されるため、別々のリポジトリに保管しています。 1つのプロジェクトに固有のブランチが他のプロジェクトのブランチリストを乱雑にしないようにしたい... – Taudris

+0

サブレポスはどうでしょうか? –

関連する問題