C#StdIn / StdOut Performance

时间:2010-08-21 21:07:02

标签: c# performance

我正在启动一个进程,并通过stdin将一个inversion xml文件写入目标进程。只有2k的数据,但传输那么多数据需要将近半秒,这对我来说似乎太过分了。我测量的是子进程使用数据所花费的时间。

有关如何加快速度的任何建议吗?

家长流程:

    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();

为了记录,我确实尝试了一个更改,我首先写出了数据的长度,然后读回了确切的字节数,以避免等待流关闭,但这并没有影响性能

我正在产生大量的小工作流程,因此每个工作人员额外的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);

第二次编辑:在这种情况下,不可能产生线程。由于超出此问题范围的原因,我需要每个人都有自己的内存空间(限制为32位2gb)。

2 个答案:

答案 0 :(得分:1)

除了不读/写数据外,您是否尝试过同样的事情? IE浏览器。衡量你的父程序启动孩子的时间,让它准备好运行,运行和退出吗?

由于你的'子'代码看起来也像C#,它可能是加载你的子exe +库,启动.Net运行时等的开销,花费0.5秒,而不是写入/读取你的数据。

也就是说,在Windows上启动新进程不是便宜(至少不像大多数* nix变体那样)。如果你担心这里的时间,你可能想看看使用线程而不是进程。

答案 1 :(得分:0)

启动子进程可能需要很长时间,而不是从stdin读取。请记住,CIL每次都需要重新进行JIT。

如果是这种情况,请考虑在您正在生成的EXE上运行ngen install。通过基本上JIT一次EXE 而不是每次运行它都会大大改善它的启动时间。