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

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

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

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

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

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


person Greg Beech    schedule 14.11.2008    source источник
comment
Удалось ли вам заставить aspnet_compiler скомпилировать сайт быстрее? Ответ, который вы приняли, не очень помог, поскольку в нем говорилось об использовании проекта веб-приложения, что вы уже делали.   -  person JeremyWeir    schedule 28.04.2010


Ответы (5)


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

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

person user38123    schedule 17.11.2008
comment
Сколько сейчас времени для предварительной компиляции этого решения? - person Cédric Boivin; 21.09.2011

Переход на компилятор Roslyn, скорее всего, значительно сократит время прекомпиляции. Вот хорошая статья об этом: https://devblogs.microsoft.com/aspnet/enables-the-net-compiler-platform-roslyn-in-asp-net-applications/.

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

person Vladimir Khvostov    schedule 26.08.2015
comment
Да, это здорово. Мы просто установили пакет Microsoft.CodeDom.Providers.DotNetCompilerPlatform в наш проект, и компиляция представлений стала почти в два раза быстрее. - person Mariusz Pawelski; 27.11.2015
comment
@MariuszPawelski Я установил это, но шаг MVCBuildViews по какой-то причине по-прежнему использует aspnet_compiler.exe. Есть ли способ заставить компилятор использовать Roslyn для предварительной компиляции представлений? Core Compile и другие шаги используют csc.exe, новый компилятор Roslyn. - person delloPiro; 11.02.2016
comment
@delloPiro Пакет Microsoft.CodeDom.Providers.DotNetCompilerPlatform является заменой встроенных поставщиков, и установка пакета - это все, что вам нужно сделать, чтобы включить их, а aspnet_compiler.exe - это просто оболочка вокруг функции компиляции среды выполнения и никоим образом не использует msbuild. Он будет компилировать только те части вашего приложения, которые были бы скомпилированы во время выполнения ASP.NET. Поэтому, если вы используете MVCBuildViews, он все равно будет использовать aspnet_compiler.exe. Это просто внутреннее использование roslyn, так что это быстрее. - person Mariusz Pawelski; 11.02.2016
comment
@delloPiro В конце концов я использовал RazorGenerator.MsBuild. Вот один учебник для этого. Он создает только бритвенные представления, но это намного быстрее, чем просто установка этого пакета DotNetCompilerPlatform. У меня была только одна проблема с помощниками, которую я решил. - person Mariusz Pawelski; 11.02.2016
comment
мертвая ссылка. 4 char - person Pxtl; 03.12.2020

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

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

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

person JerKimball    schedule 16.01.2013

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

person Will Dean    schedule 14.11.2008

Только мои 2 цента.

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

При публикации приложения wep из Visual Studio убедитесь, что вы выбрали «Не объединять» и не выбираете «создавать отдельную сборку», потому что это вызывает глобальную блокировку и замедляет работу.

введите описание изображения здесь

Подробнее см. https://msdn.microsoft.com/en-us/library/hh475319(v=vs.110).aspx.

person Alex from Jitbit    schedule 08.06.2018
comment
Я отклонил этот ответ, потому что он неверен. Параметры слияния предназначены для aspnet_merge.exe, которая является отдельной программой от aspnet_compiler.exe, о котором задается этот вопрос. Параметры слияния вообще не влияют на aspnet_compiler.exe производительность (и aspnet_merge.exe запускается после aspnet_compiler.exe на отдельном шаге MSBuild). - person Dai; 10.10.2019
comment
@ Да нет, вот цитата из документов: Не объединять - этот параметр не запускает aspnet_merge.exe и не использует параметр -fixednames команды aspnet_compiler.exe. - person Alex from Jitbit; 28.03.2020