我使用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和类似的问题。显然,在简单的测试程序中,我现在没有读取任何输出,只是执行。
可能的原因我已经排除了导致执行时间无差异的原因:
我对可执行文件(它的防锈语句完成工具&#39; racer&#39; https://github.com/phildawes/racer)所了解的是,它会关闭并打开大量文件。来自.NET主机的重要性,例如WRT。安全性,导致放缓?还有什么可能导致巨大的性能差异?
答案 0 :(得分:3)
在这种情况下,运行时间的差异是由于执行的(racer.exe
)文件的不同版本,并且与一个从.NET进程执行而另一个从.NET进程执行的事实无关命令行。
从.NET运行可执行文件时应该没有区别,因为它只是使用系统调用来执行程序。
答案 1 :(得分:2)
ps.WaitForExit();
这是有所作为的声明。您的cmd.exe命令不会等待进程终止。删除WaitForExit()或使用&#34; cmd / c start / wait%EXE %% ARGS%&#34;将苹果与橙子进行比较。
或者换句话说,您没有测量启动流程所需的时间,您测量了流程运行的时间。