我在使用.exe执行Process.Start()时遇到了性能问题。从.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 did似乎是一个可能的执行时间。
起初,我正在阅读性病,并认为这与此有关,参见Process takes longer to finish than in CMD和类似的问题。显然,在简单的测试程序中,我现在没有读取任何输出,只是执行。
我已经排除了可能的原因,因为这一原因在执行时间上没有任何差别:
关于可执行文件(它是锈蚀语句完成工具'racer‘https://github.com/phildawes/racer),我所知道的是它会运行并打开许多文件。当从.NET主机(例如wrt )来时,这会有什么关系吗?安全,那会导致经济放缓吗?还有什么能导致巨大的性能差异呢?
发布于 2014-12-02 14:49:00
在这种情况下,运行时间的差异是由于不同版本的已执行(racer.exe)文件,而与一个是从.NET进程执行,另一个是从命令行执行这一事实无关。
从.NET运行可执行文件时不应该有什么区别,因为它只是使用系统调用来执行程序。
发布于 2014-11-27 12:34:31
ps.WaitForExit();这就是区别所在的陈述。您的cmd.exe命令不会等待进程终止。要么删除WaitForExit(),要么使用"cmd /c start /wait %EXE% %ARGS%“来比较苹果和橙子。
换句话说,您没有度量启动进程所用的时间,而是测量进程运行的时间。
https://stackoverflow.com/questions/27168762
复制相似问题