Подтвердить что ты не робот

Почему aspnet_compiler.exe настолько медленный (и может ли он быть сделан быстрее)?

Во время нашего процесса сборки мы запускаем aspnet_compiler.exe на наших веб-сайтах, чтобы убедиться, что все связанные с последним вещи в ASP.NET/MVC фактически строятся (я ничего не знаю об ASP.NET, но я уверен, что это необходимо, чтобы предотвратить поиск сбои во время выполнения).

Наши сайты довольно большие по размеру, с несколькими сотнями страниц/просмотров/элементов управления и т.д. однако сделанное время кажется чрезмерным в диапазоне 10-15 минут (для справки это длиннее, чем требуется всего решения с примерно 40 проектами для компиляции, и мы только предварительно скомпилируем два веб-проекта).

Я сомневаюсь, что аппаратное обеспечение является проблемой, поскольку я работаю на последнем четырехъядерном чипе Intel с 4 ГБ оперативной памяти и жестком диске WD Velociraptor 10 000 об/мин. И часть того, что странно, что EXE, похоже, не использует много CPU (1-5%) и, похоже, не делает слишком много ввода-вывода.

Итак... это известная проблема? Почему это так медленно? И есть ли способ ускорить его?

Примечание. Чтобы прояснить пару вопросов, о которых люди ответили, я не говорю о компиляции кода в Visual Studio. Мы уже используем проекты веб-приложений, и скорость их компиляции не является проблемой. Проблема заключается в предварительной компиляции сайта после того, как эти проекты уже скомпилированы (см. Эту страницу MSDN для более подробной информации) в качестве части разработчика построить script. Мы выполняем предварительную компиляцию на месте, а не копируем файлы в целевой каталог.

4b9b3361

Ответ 1

  • Компилятор должен генерировать второй файл с кодом для каждой страницы .aspx, check
  • Во время компиляции aspnet_compiler.exe скопирует ВСЕ файлы веб-сайта в выходной каталог, включая css, js и images.

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

Ответ 2

Переключение на компилятор Roslyn, скорее всего, значительно улучшит прекомпиляцию. Вот хорошая статья: http://blogs.msdn.com/b/webdev/archive/2014/05/12/enabling-the-net-compiler-platform-roslyn-in-asp-net-applications.aspx.

В дополнение к этому убедитесь, что пакетная компиляция включена, установив атрибут партии в значение true в элементе компиляции.

Ответ 3

Просто aspnet_compiler использует то, что эффективно является "глобальной блокировкой компилятора" всякий раз, когда начинается предварительная компиляция любой отдельной страницы aspx; в основном разрешается только скомпилировать каждую страницу.

Есть причины для этого (хотя я лично не согласен с ними) - прежде всего, чтобы обнаружить и предотвратить циклические ссылки, вызывающие бесконечный цикл, а также обеспечить правильное построение всех зависимостей до того, как требуемая страница будет скомпилирована, они избегают множества "неприятных проблем с CS".

Когда-то я начал писать широкомасштабную версию aspnet_compiler.exe в прошлый раз, когда работал в веб-компании, но привязался к "реальной работе" и никогда не заканчивал ее. Самая большая проблема - страницы ASPX: материал MVC/Razor, который вы можете распараллелить из HELL, но механизм анализа/компиляции ASPX составляет около 20 уровней внутренних и частных классов/методов.

Ответ 4

У меня нет специальных подсказок для этого компилятора, но когда у меня такая проблема, я запускаю ProcMon, чтобы посмотреть, что делает процесс на машине, и я запускаю Wireshark, чтобы проверить, что это не тратить возраст, выбирая некоторый сетевой доступ к давно забытой машине, на которую ссылаются в каком-либо ключе реестра или переменной среды.