Обложка канала

.NET Разработчик

Опытный разработчик не так давно зашёл в .Net и поставил цель получить сертификат Microsoft. Свой ежедневный прогресс он описывает на канале .Net Разработчик. Заметки об изученном материале, советы по повышению производительности и поддержке мотивации, ин

.NET Разработчик

4 года назад
Открыть в
День 1146. Улучшаем Производительность Сборки в Visual Studio. Начало Время — ваш самый ценный актив, и медленная сборка занимает первое место в списке убийц продуктивности разработчиков. При медленной сборке теряется не только время на саму сборку, но часто и вы сами отвлекаетесь на другие задачи, такие как проверка почты, кофе, социальные сети… Таким образом, борьба за сокращение времени сборки имеет важное значение. Измерение Прежде чем улучшать, нужно сначала измерить. Расширение Visual Studio Build Timer отображает статистику и водопадную диаграмму вашей сборки в Visual Studio. Инструмент доступен в меню View > Other Windows > Build Timer (Вид > Другие окна > Таймер сборки) и позволяет увидеть, какие проекты собираются дольше, а какие быстрее, какие проекты ждут сборки других и т.п. Фильтры решений Обычно мы обычно работаем только с несколькими проектами из решения. Поэтому можно вручную выгружать ненужные проекты, чтобы добиться более быстрой компиляции. Процесс выгрузки набора проектов можно значительно улучшить, определив файл фильтра решения (.slnf). Чтобы его создать, просто выгрузите несколько проектов, щёлкните правой кнопкой мыши на решении и выберите в меню Save as Solution Filter (Сохранить как фильтр решения). VS рассматривает файлы фильтров решений (.slnf) как файлы решений (.sln). Файл фильтра представляет собой текстовый файл, который можно легко редактировать. Загрузка фильтра решения загружает целевые проекты и полностью игнорирует другие: они даже не отображаются как выгруженные. Выгрузка/загрузка проектов в открытом фильтре вызывает подсказку, предлагающую обновить фильтр. Имейте в виду, что у выгрузки проектов есть и обратная сторона: изменения, сделанные в публичных API ваших проектов не будут отражены в выгруженных клиентских проектах. Инкрементная сборка В контексте VS MSBuild проверяет актуальность выходных данных проекта, чтобы определить, нужно ли его компилировать. Эта функция называется Incremental Build и необходима для значительного сокращения количества компилирующихся проектов для ускорения сборки. Основные причины неактуальности проекта: - Один из файлов, используемых в качестве входных данных проекта (исходный файл, файл ресурсов…), имеет более новую временную метку, чем временная метка выходного файла проекта (.dll, .pdb, .xml…). - Проект зависит как минимум от одного устаревшего проекта. Инкрементальные проверки сборки не могут быть идеальными, особенно когда используются некоторые нетривиальные функции. Например, если в одном из файлов проекта для свойства Copy to Output Directory (Копировать в выходной каталог) установлено значение Copy Always (Копировать всегда), проект никогда не будет считаться актуальным. Такая причина не очевидна. Чтобы это обнаружить перейдите в Options > Projects and Solutions > SDK-Style Projects (Параметры > Проекты и решения > Проекты SDK) измените для параметра Logging Level значение с None на Minimal. Теперь в окне Output при сборке можно заметить строку:
1>FastUpToDate: Item … has CopyToOutputDirectory set to 'Always', not up to date.

Это поможет понять, что заставляет проект перекомпилироваться каждый раз. Чтобы избавиться от этого, просто установите Copy to Output Directory на Copy if Newer (Копировать, если новее). Чтобы узнать, есть ли у вашего решения такая проблема: сначала выполните Build > Rebuild Solution, а затем Build > Build Solution. Если какие-то проекты перекомпилируются второй раз, исследуйте проблему. Окончание следует… Источник: blog.ndepend.com/improve…formance