У меня возникают проблемы с производительностью .exe с помощью Process.Start()
. Выполнение занимает примерно в 5 раз больше от .NET, чем от консоли. Что может вызвать это? Вот тестовая программа:
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 и думал, что это связано с этим, см., например, Процесс занимает больше времени, чем в CMD и аналогичные вопросы. Очевидно, что в простой тестовой программе я сейчас не читаю никакого вывода, просто выполняя.
Возможные причины, по которым я исключаю исключение, не приводят к разнице во времени выполнения:
- Отладчик/отладчик
- Отладка/выпуск сборки хост-процесса .NET
- Рабочий каталог
- Платформа хоста .NET-процесса Any/x86/x64 (exe является родной x64)
- UseShellExecute true/false
То, что я знаю об исполнителе (это инструмент завершения заявления о ржавчине "racer" https://github.com/phildawes/racer) заключается в том, что он отключится и открыть много файлов. Может ли это иметь значение при выходе из хоста .NET, например? WRT. безопасности, что приводит к замедлению? Что еще может вызвать огромную разницу в производительности?