Process.Start() значительно медленнее, чем выполнение в консоли

У меня возникают проблемы с производительностью .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. безопасности, что приводит к замедлению? Что еще может вызвать огромную разницу в производительности?

Ответ 1

Разница в времени выполнения в этом случае была обусловлена ​​различными версиями исполняемого файла (racer.exe) и не имела ничего общего с тем фактом, что один из них выполнялся из .NET-процесса, а другой из команды линия.

При запуске исполняемого файла из .NET не должно быть разницы, поскольку он просто использует системные вызовы для выполнения программы.

Ответ 2

    ps.WaitForExit();

Это утверждение, которое делает разницу. Команда cmd.exe не ждет завершения процесса. Удалите WaitForExit() или используйте "cmd/c start/wait% EXE%% ARGS%", чтобы сравнить яблоки с апельсинами.

Или, другими словами, вы не измеряли, сколько времени потребовалось для запуска процесса, вы измерили, как долго выполнялся этот процесс.