代码之家  ›  专栏  ›  技术社区  ›  Alan Jackson

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

  •  4
  • Alan Jackson  · 技术社区  · 14 年前

    我正在启动一个进程,并通过stdin向目标进程写入一个指令XML文件。只有2千个数据,但是传输这么多的数据几乎需要半秒钟,对我来说这似乎太多了。我衡量的是子进程使用数据所需的时间。

    有什么关于如何加快速度的建议吗?

    父进程:

        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 回复  |  直到 10 年前
        1
  •  1
  •   Jonathan Rupp    14 年前

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

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

    也就是说,在Windows上启动新进程不是 便宜的 (至少不像大多数尼克斯变种那样)。如果您关心的是时间问题,那么您可能希望使用线程而不是进程。

        2
  •  0
  •   Timwi    14 年前

    可能是启动子进程花费的时间太长,而不是从stdin读取。记住,CIL每次都需要重新抖动。

    如果是这样,考虑跑步 ngen install 在生成的exe上。这将大大提高它的启动时间,基本上通过抖动子exe 一旦 而且不是每次你跑步。