我正在启动一个进程并通过 stdin 将一个 intruction 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 秒正在杀死我!

编辑: 我感谢所有评论,但我特别在寻找任何方法来提高标准输入性能。我提到的 .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)。

最佳答案

除了不读/写数据之外,您是否尝试过做同样的事情? IE。测量父程序启动子程序所需的时间,是否准备好运行、运行和退出?

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

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

关于C# 标准输入/标准输出性能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3538989/

10-11 01:53