Почему 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. Мы выполняем предварительную компиляцию на месте, а не копируем файлы в целевой каталог.
Ответы
Ответ 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, чтобы проверить, что это не тратить возраст, выбирая некоторый сетевой доступ к давно забытой машине, на которую ссылаются в каком-либо ключе реестра или переменной среды.