Уменьшение времени компиляции csc.exe при использовании пакета "Microsoft.CodeDom.Providers.DotNetCompilerPlatform" - PullRequest
0 голосов
/ 12 октября 2018

Наша команда в настоящее время мигрирует с синтаксиса C # 5.0 на C # 6.0, поэтому вместо устаревшего должен использоваться компилятор Roslyn.

Мы должны использовать «csc.exe» как часть компиляции комплексного решения.процесс.Команды сборки выглядят так:

c:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe -nologo -target:library  -out:c:\repo\bin64\deb\common.dll @.\rspE0FF.tmp

Выполнение этой команды занимает ~ 400 мс

"rspE0FF.tmp" содержимое выглядит так (оно содержит гораздо больше * .csфайлы, однако, это не имеет значения, это воспроизводимо на любом наборе файлов):

"c:\repo\shared\common\estimation\complexjob.cs"
"c:\repo\shared\common\stringdecorator.cs"
"c:\repo\shared\common\tplextensions.cs"
"/reference:mscorlib.dll" "/reference:System.dll" "/reference:System.Data.dll" "/reference:System.Xml.dll" "/reference:System.ServiceModel.Activation.dll" "/reference:System.IdentityModel.dll" "/reference:System.Data.Entity.dll" 

Когда используется компилятор Roslyn, время выполнения выдает ~ 4100ms Команда одинакова, простоcsc.exe вызывается из папки пакета:

c:\NewRepo\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.2.0.1\tools\RoslynLatest\csc.exe -nologo -target:library -out:c:\repo\bin64\deb\common.dll @.\rspE0FF.tmp

Мы должны построить решение, последовательно выполняя сотни таких команд csc.exe, как эта.Общее время компиляции выросло с 2 минут до 8 минут.

Ожидается ли это снижение производительности?

Любые советы о том, как это настроить?

1 Ответ

0 голосов
/ 12 октября 2018

Команда roslyn не считает, что кто-то вызывает csc.exe как часть своих исследований.Сегодня вы запускаете все программы csc.exe при каждом вызове (см. здесь для получения дополнительной информации).

Возможные решения:

  • Запустите ngen в той версии csc, которую вы используете, так что, надеюсь, вам нужно будет JIT только один раз
  • использовать сервер компилятора, который в дополнение к повторному использованию экземпляров csc также кэширует метаданные во всех сборках.

ПРИМЕЧАНИЕ: задача msbuild делает это автоматически за вас, но в вашем случае вам нужно будет сделать это вручную.

Вам необходимо настроить сервер (продублировать, что этот код делает) и передать /server на все ваши вызовы csc

...