Process.Start()明显慢于在控制台中执行

时间:2014-11-27 10:48:27

标签: c# .net

我使用Process.Start()执行.exe时出现性能问题。从.NET到控制台,执行大约需要5倍的时间。是什么导致这个?这是一个测试程序:

  public static void Main(string[] argv)
  {       
     for (int i = 0; i < 10; i++)
     {
        ProcessStartInfo psi = new ProcessStartInfo(ExePath, Args);
        Process ps = new Process {StartInfo = psi};
        Stopwatch sw = Stopwatch.StartNew();
        ps.Start();
        ps.WaitForExit();
        sw.Stop();
        Console.WriteLine(i+" Elapsed time: " + sw.ElapsedMilliseconds + "ms.");
        Thread.Sleep(1000);
     }
  }

结果如下:

 0 Elapsed time 4310ms.
 1 Elapsed time 4330ms.
 2 Elapsed time 4280ms.
 ...

在cmd窗口中运行它几乎立即返回(低于1秒执行)。尝试使用

在控制台中计时
> powershell Measure-Command { cmd /c start /wait %EXE% %ARGS% } 

执行时显示大约750毫秒,这是一个好的5-6倍。不确定我做得对,但750毫秒感觉可能是执行时间。

起初我正在阅读std并认为它与此有关,请参阅例如Process takes longer to finish than in CMD和类似的问题。显然,在简单的测试程序中,我现在没有读取任何输出,只是执行。

可能的原因我已经排除了导致执行时间无差异的原因:

  • 调试器/无调试器
  • .NET主机进程的调试/发布版本
  • 工作目录
  • 主机.NET进程的平台Any / x86 / x64(exe是本机x64)
  • UseShellExecute true / false

我对可执行文件(它的防锈语句完成工具&#39; racer&#39; https://github.com/phildawes/racer)所了解的是,它会关闭并打开大量文件。来自.NET主机的重要性,例如WRT。安全性,导致放缓?还有什么可能导致巨大的性能差异?

2 个答案:

答案 0 :(得分:3)

在这种情况下,运行时间的差异是由于执行的(racer.exe)文件的不同版本,并且与一个从.NET进程执行而另一个从.NET进程执行的事实无关命令行。

从.NET运行可执行文件时应该没有区别,因为它只是使用系统调用来执行程序。

答案 1 :(得分:2)

    ps.WaitForExit();

这是有所作为的声明。您的cmd.exe命令不会等待进程终止。删除WaitForExit()或使用&#34; cmd / c start / wait%EXE %% ARGS%&#34;将苹果与橙子进行比较。

或者换句话说,您没有测量启动流程所需的时间,您测量了流程运行的时间。