Почему время запуска моего приложения медленнее, когда я использую Process.Start()?

Я пытаюсь профилировать время запуска моего приложения, поэтому я написал небольшую программу на C#, которая будет запускать мое приложение с помощью метода Process.Start() и определять время с помощью секундомера.

Когда я пытаюсь запустить приложение самостоятельно (просто нажав на него), это, вероятно, занимает 2-3 секунды. Когда я пытаюсь запустить приложение с помощью своей тестовой программы, это занимает 8-10 секунд. Время запуска постоянно различается по этой величине.

Есть идеи, почему использование Process.Start для запуска исполняемого файла так сильно влияет на время запуска?


person dreadpirateryan    schedule 27.08.2010    source источник
comment
вы запускаете его под отладчиком? Или в режиме релиза? Вы запускаете его в визуальной студии или в командной строке?   -  person C Johnson    schedule 27.08.2010
comment
Я запускаю его в режиме Release и из командной строки   -  person dreadpirateryan    schedule 27.08.2010


Ответы (3)


Спасибо за вашу помощь. У меня есть ответ, и он не имеет отношения к Process.Start.

После того, как я запустил процесс, я ждал появления определенного дескриптора окна, чтобы узнать, что приложение действительно появилось. Петля была слишком тугой. Я ввел спящий режим на 200 мс в цикле while, и время запуска снова стало нормальным.

person dreadpirateryan    schedule 28.08.2010
comment
dreadpirateriyan, выберите этот ответ в качестве ответа, даже если он исходит от вас, чтобы помочь другим найти это быстрее. - person Marcel; 28.08.2010

Ваша подсказка должна заключаться в том, что Process.Start() находится в пространстве имен System.Diagnostics. Когда вы запускаете процесс таким образом, вы прикрепляете к нему группу мониторов/инспекторов. Это определенно добавляет накладные расходы.

Возможно, вы захотите попробовать сразу вызвать Dispose() для объекта Process после его запуска (чтобы избежать ненужного длительного наблюдения за процессом), но вы не сможете полностью избежать связанных с этим накладных расходов.

person Bradley Smith    schedule 27.08.2010
comment
Я ничего не вижу в документации об использовании Process.Start, что приводит к снижению производительности во время выполнения для порожденного приложения. У вас есть ссылки? Мне было бы интересно почитать об этом. - person Kirk Woll; 27.08.2010

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

Когда вы дважды щелкаете свое приложение, вы загружаете только одно приложение и все его библиотеки DLL.

Когда вы запускаете свое диагностическое приложение, вы сначала загружаете первое приложение с его сборками .NET, которые должны быть JIT'd (компиляция Just in time: это не бесплатно). Только после того, как все это будет сделано, запустится ДРУГОЕ приложение. Если ваше целевое приложение также является приложением .NET, то весь цикл повторяется.

person C Johnson    schedule 27.08.2010
comment
Он измеряет время с помощью секундомера, поэтому, по-видимому, он измеряет только время запуска процесса, а не время запуска своего тестового приложения. - person Kirk Woll; 27.08.2010