4


0

C#StdIn / StdOutパフォーマンス

プロセスを起動し、標準入力を介して宛先プロセスにintruction xmlファイルを書き込みます。 データは2kしかありませんが、その量のデータを転送するのにほぼ0.5秒かかります。 私が測定しているのは、子プロセスがデータを消費するのにかかる時間です。

これをスピードアップする方法についての提案はありますか?

親プロセス:

    ProcessStartInfo psi = new ProcessStartInfo(path, args);
    psi.CreateNoWindow = true;
    psi.UseShellExecute = false;
    psi.RedirectStandardInput = true;
    Process p = Process.Start(psi);
    p.StandardInput.Write(stdin);
    p.StandardInput.Close();

子プロセス:

    Stream s = Console.OpenStandardInput();
    StreamReader sr = new StreamReader(s);
    return sr.ReadToEnd();

レコードについては、最初にデータの長さを書き、その正確なバイト数を読み取ってストリームが閉じるのを避けるために1つの変更を試みましたが、それはパフォーマンスにまったく影響しませんでした。

私は多くの小さなワーカープロセスを生成しているので、ワーカーごとに0.5秒余分に余分な時間がかかります。

*編集:*すべてのコメントに感謝しますが、stdinのパフォーマンスを改善する方法を特に探しています。 私が言及した.5sは、子プロセスコードの周りで測定されています:

    Stopwatch sw = new Stopwatch();
    sw.Reset();
    sw.Start();
    string stdin = ReadStdIn();
    sw.Stop();
    Console.WriteLine("Elapsed time to read stdin: " + sw.ElapsedMilliseconds);
  • 2回目の編集:*この場合、スレッドを生成することはできません。 この質問の範囲を超える理由により、それぞれが独自のメモリスペース(32ビット2 GBに制限)を持つように作業する必要があります。

2 Answer


1


データの読み取り/書き込みを行わないことを除いて、これと同じことを試しましたか? Ie. 親プログラムが子を起動するのにかかる時間を測定し、実行、実行、終了の準備をしますか?

「子」コードもC#のように見えるため、子exe +ライブラリのロード、.Netランタイムの起動などのオーバーヘッドになる可能性があります。 データの書き込み/読み取りではなく、0.5秒かかります。

とは言っても、Windowsで新しいプロセスを開始するのは_cheap_ではありません(少なくとも、ほとんどの* nixバリエーションとは異なります)。 ここでタイミングが気になる場合は、プロセスの代わりにスレッドを使用することを検討してください。


0


子プロセスの起動には、stdinからの読み取りではなく、非常に時間がかかっている可能性があります。 CILは毎回新たにJITされる必要があることに注意してください。

その場合は、生成するEXEでhttp://msdn.microsoft.com/en-us/library/6t9t5wcf%28VS.80%29.aspx[ngen install]を実行することを検討してください。 これは、実行するたびにではなく、基本的に子EXEを_once_にJITすることにより、起動時間を劇的に改善します。