C#标准输入/标准输出性能

C#标准输入/标准输出性能,c#,performance,C#,Performance,我正在启动一个进程,并通过stdin向目标进程写入一个指令xml文件。数据量只有2k,但传输这么多数据几乎需要半秒钟,这对我来说似乎太多了。我测量的是子进程消耗数据所需的时间量 关于如何加快这一进程,有什么建议吗 父进程: ProcessStartInfo psi = new ProcessStartInfo(path, args); psi.CreateNoWindow = true; psi.UseShellExecute = false; psi.Redir

我正在启动一个进程,并通过stdin向目标进程写入一个指令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();
子进程:

    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)。

除了不读取/写入数据外,您是否尝试过做同样的事情?例如,测量您的家长程序启动孩子所需的时间,让它准备运行、运行和退出

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


也就是说,在windows上启动新进程并不便宜(至少不像在大多数*nix变体上那样)。如果您担心这里的计时问题,您可能希望使用线程而不是进程。

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


如果是这样的话,考虑在EXE上运行你正在产卵。这将极大地提高其启动时间,基本上只需一次而不是每次运行子EXE即可。

生成大量小工作线程。ngen将有助于缩短启动时间,但是进程启动和.net启动时间可能仍然超出了您的处理能力。@Jonathan:我建议让OP来尝试解决方案,并决定它是否足够快以达到他的目的。一般来说,ngen可能会有所帮助,但对于我的具体情况,我正在测量子进程在stdin中实际读取的时间,不是启动时间。谢谢你的评论,但我是在子流程中测量的(一旦它已经启动)。我在测量从stdin读取数据所需的时间。