我使用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% }
执行时间约为750ms,比原来快了5-6倍。我不确定是否正确,但750ms似乎是一个可能的执行时间。
一开始我读取标准输出并认为与此有关,参见例如Process takes longer to finish than in CMD等类似问题。显然,在简单的测试程序中,我现在没有读取任何输出,只是执行。
我已经排除了以下可能导致执行时间无差别的原因:
- 调试器/无调试器
- .NET主机进程的Debug/Release版本
- 工作目录
- 主机.NET进程的平台Any/x86/x64 (exe是本地x64)
- UseShellExecute true/false
我知道可执行文件(它是Rust语句完成工具“racer”https://github.com/phildawes/racer)会打开很多文件。当从.NET主机来时,这是否会有影响,例如在安全性方面导致了减速?还有什么其他原因会导致巨大的性能差异?