【发布时间】:2014-11-27 10:48:26
【问题描述】:
我在使用 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 真/假
我对可执行文件的了解(它是 rust 语句完成工具 'racer' https://github.com/phildawes/racer)是它会启动并打开大量文件。当来自 .NET 主机时,这是否重要,例如wrt。安全,导致减速?还有什么可能导致巨大的性能差异?
【问题讨论】:
-
您的时间安排远不止开始这个过程。
-
@leppie 那会是什么?我在那里看不到更多。
-
我无法想象创建这两个对象需要几秒钟。更像是微秒。
-
这就是我的问题的答案,如果有任何理由创建进程(对象)需要 3 秒以上。正如预期的那样,在软件之外创建它的差异是微不足道的。编辑代码示例。
-
哎呀,你成功了!二进制文件的版本略有不同,性能差异很大。什么面子。我希望你有一个我可以接受的答案,至少可以给你积分。感谢您的帮助!