Сколько времени занимает загрузка 500-строчного .net-приложения? - PullRequest
1 голос
/ 15 сентября 2010

Предположим, у меня есть приложение, написанное на нативном C ++ (более 500 тыс. Строк кода), и я хочу перенести его в .NET (C #). Одна вещь, о которой я беспокоюсь, - это JIT-компилятор. Компилятору моего нативного кода требуется более 30 секунд для компиляции. Означает ли это, что каждый раз, когда пользователь запускает мое приложение на C #, он будет загружаться так долго (поскольку JIT-компилятор должен компилировать его каждый раз)?

Ответы [ 6 ]

1 голос
/ 15 сентября 2010

Ваше приложение начнет работать сразу же, JIT-компилятор не компилирует код до тех пор, пока он не будет вызван, не все сразу.Во-вторых, если время запуска вашего приложения слишком медленное, возможно, вы захотите взглянуть на Ngen, который компилирует и сохраняет сборки в собственном кэше изображений.

1 голос
/ 15 сентября 2010

JIT-компилятор не совсем "компилируется" в том смысле, в каком вы думаете.Это преобразование одного набора команд (байт-код IL) в другой (машинный код x86 или x64) по требованию.Конверсия довольно проста по своему замыслу и не требует столько времени, сколько требуется C ++ для компиляции приложения.Обычно это происходит не сразу («как раз вовремя» означает, что инструкции переводятся примерно в то время, когда они «выполняются»), поэтому приложение запустится довольно быстро.

Отнимающая много времени часть компиляции - это преобразование из машиночитаемых инструкций (исходного кода) в машиночитаемые (байт-код или собственный код, в зависимости от вашего языка / платформы).Эта часть уже выполнена при создании EXE-файла, и ее не нужно переделывать, если исходный код (или его значение) не изменятся.

1 голос
/ 15 сентября 2010

Загрузчик сборок .NET будет загружать сборки по требованию.Они уже готовы к запуску в байт-коде виртуальной машины CLR.Любой JIT, который происходит, спроектирован так, чтобы происходить также по требованию и по частям в зависимости от того, как называются пути кода.(другими словами, небольшие быстрые фрагменты. И это может даже не произойти во всем коде.)

Я бы не стал беспокоиться о JIT.Убедитесь, что приложение является модульным, и ознакомьтесь с инструментами профилирования, чтобы выявлять замедления при их возникновении.

0 голосов
/ 16 сентября 2010

На самом деле JIT дает преимущество в производительности для некоторых долго работающих приложений, интенсивно использующих процессор *.

1) Методы класса JIT'ы в том порядке, в котором они были впервые использованы
2) Для многих приложений улучшится локальность кода (устранение промахов кэша ЦП)
* - приложения с этими качествами имеют тенденцию быть серверными

Но если время запуска вас беспокоит, тогда NGen по крайней мере для сборок, которые содержат код запуска (если он может быть изолирован), поскольку код запуска часто загружается только один раз и не будет извлекать выгоду из локальности JIT по требованию .

Приятной особенностью улучшений CLR за последние пару лет стало облегчение некоторых серьезных проблем с производительностью при запуске, таких как коллизии базовых адресов (см. http://msdn.microsoft.com/en-us/magazine/dd569747.aspx), и улучшения в таких инструментах, как NGen, для сокращения накладных расходов (время NGen) после того, как установка приложения была сокращена.) Если вы используете .NET 3.5 и беспокоитесь о времени запуска, вы можете измерить при запуске 32-разрядную и 64-разрядную версию, поскольку JIT имел очень разные бэкэнды для x86 / x64 до .NET 4.

0 голосов
/ 15 сентября 2010

JIT-компиляция работает не так.

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

Компиляция JIT, как следует из названия, «Just In Time».Это означает, что он компилирует только части байт-кода в нативный код по мере необходимости , а не все приложение.

Одним из результатов этого является то, что анализ времени выполнения может повысить производительность по сравнению с долго работающими приложениями.

0 голосов
/ 15 сентября 2010

Это будет зависеть от многих факторов, и недостаточно информации, чтобы знать, просто предоставление времени, необходимого компилятору собственного кода для компиляции, не дает достаточно информации. В зависимости от того, что делает приложение, это может занять от 30 секунд до часов.

...