Очень медленное время компиляции в Visual Studio 2005

Мы получаем очень медленное время компиляции, которое может занимать более 20 минут на двухъядерных машинах с тактовой частотой 2 ГГц и 2 Гб оперативной памяти.

Во многом это связано с размером нашего решения, которое выросло до 70+ проектов, а также с VSS, который сам по себе является узким местом, когда у вас много файлов. (замена VSS, к сожалению, не вариант, поэтому я не хочу, чтобы это переходило в Bash VSS)

Мы рассматриваем объединение проектов. Мы также ищем несколько решений для достижения большего разделения проблем и сокращения времени компиляции для каждого элемента приложения. Я вижу, это превратится в ад для DLL, поскольку мы пытаемся поддерживать синхронизацию.

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

ОБНОВИТЬ Я забыл упомянуть, что это решение C#. Спасибо за все предложения C++, но прошло несколько лет с тех пор, как мне приходилось беспокоиться о заголовках.

Обновлено:

Хорошие предложения, которые помогли до сих пор (не говоря уже о том, что ниже нет других хороших предложений, просто то, что помогло)

  • Новый ноутбук с тактовой частотой 3 ГГц - сила потери нагрузки творит чудеса, когда мы обращаемся к руководству
  • Отключить антивирус во время компиляции
  • `` Отключение '' от VSS (фактически от сети) во время компиляции - я могу заставить нас полностью удалить интеграцию VS-VSS и придерживаться пользовательского интерфейса VSS.

По-прежнему не копирует компиляцию, но помогает каждый бит.

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

РЕШЕНИЕ

Мы тестируем практику создания новых областей приложения в новых решениях, при необходимости импортируя новейшие библиотеки DLL и интегрируя их в более крупное решение, когда мы довольны ими.

Мы также можем сделать то же самое с существующим кодом, создав временные решения, которые просто инкапсулируют области, над которыми нам нужно работать, и выбрасывая их после реинтеграции кода. Нам нужно взвесить время, необходимое для реинтеграции этого кода, и время, которое мы выиграем, не имея опыта быстрой перекомпиляции в процессе разработки, как у Рип Ван Винкля.

Ничего себе, я думал, что 20 секунд компиляции - это ужасно долго.

Jared Updike 03.02.2011 05:20

По возможности старайтесь избегать множественных решений, поскольку рефакторинг становится намного сложнее.

Ian Ringrose 25.03.2011 15:25

Вы можете использовать VSS за пределами Visual-Studio, чтобы избежать накладных расходов на общение Visual-Studio с VSS.

Ian Ringrose 25.03.2011 15:36

Как насчет ресурсов? Представляю, они замедляют процесс. Я видел коммерческое программное обеспечение с exe-файлами размером с компакт-диск, которое вы запускаете с компакт-диска (а не установки). Они были полны видео, аудио и изображений. Итак, программа была всего лишь одним файлом ....

Bitterblue 22.07.2014 17:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
132
4
86 443
34
Перейти к ответу Данный вопрос помечен как решенный

Ответы 34

Используйте распределенную компиляцию. Xoreax IncrediBuild может сократить время компиляции до нескольких минут.

Я использовал его в огромном решении C \ C++, компиляция которого обычно занимает 5-6 часов. IncrediBuild помог сократить это время до 15 минут.

Установка IncrediBuild на несколько запасных ПК сократила время компиляции в 10 или более раз для нашего проекта C++ практически без усилий по администрированию.

Stiefel 08.03.2011 15:19

был такой же опыт аку ... однако ссылка все еще была проблемой хе-хе

Paul Carroll 31.05.2011 05:37

Если вы идете по этому пути, то подойдет просто пара выделенных серверов сборки. Однако похоже, что OP пытался исправить время сборки на локальных машинах разработчика.

NotMe 18.12.2013 18:55

Первоначально я разместил этот ответ здесь: https://stackoverflow.com/questions/8440/visual-studio-optimizations#8473 Вы можете найти много других полезных советов на этой странице.

Если вы используете Visual Studio 2008, вы можете скомпилировать с помощью флага / MP для параллельной сборки одного проекта. Я читал, что это тоже недокументированная функция в Visual Studio 2005, но никогда не пробовал.

Вы можете строить несколько проектов параллельно, используя флаг / M, но обычно он уже установлен на количество доступных ядер на машине, хотя я считаю, что это применимо только к VC++.

Будь осторожен. В 2008 году есть ошибка, из-за которой сборки усекаются. MS говорят, что не исправят до vs2010. Это ужасная проблема, потому что она обрезает файлы .obj, вызывая постоянные сбивающие с толку проблемы сборки. вы были предупреждены. ;) social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/…

Justin 22.08.2012 06:00

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

Если вас беспокоит, что разные версии DLL перепутаются, используйте статические библиотеки.

Библиотека DLL (и ее различные собратья любят разделяемые библиотеки) сегодня почти всегда плохая идея для разработчика приложений. Исполняемые файлы имеют небольшой размер, даже если вы подключаете каждую последнюю используемую библиотеку, и объем памяти, который вы экономите, разделяя код, также невелик. Библиотеки DLL восходят к тем временам, когда объем программного кода в памяти и на диске имел ключевое значение, но размер данных, памяти и диска рос намного быстрее, чем размер программ.

Tom Swirly 29.04.2011 20:58

Если это C или C++, и вы не используете предварительно скомпилированные заголовки, вам следует их использовать.

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

Tom Swirly 29.04.2011 20:54

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

<compilation defaultLanguage = "c#" debug = "true" batch = "true" >  

Вы можете найти обзор здесь: http://weblogs.asp.net/bradleyb/archive/2005/12/06/432441.aspx

Отключите интеграцию VSS. У вас может не быть выбора в его использовании, но библиотеки DLL все время «случайно» переименовываются ...

И обязательно проверьте настройки предварительно скомпилированного заголовка. Руководство Брюса Доусона немного устарело, но все же очень хорошее - проверьте: http://www.cygnus-software.com/papers/precompiledheaders.html

Конечно, мы можем отключить интеграцию с VSS и вместо этого использовать Source Safe UI. Хорошая мысль

johnc 11.09.2008 06:15

У меня есть проект, который имеет 120 или более exes, libs и dll и требует значительного времени для создания. Я использую дерево пакетных файлов, которое вызывает создание файлов из одного основного пакетного файла. В прошлом у меня были проблемы со странностями из инкрементных (или они были темпераментными) заголовками, поэтому сейчас я их избегаю. Я делаю полную сборку нечасто и обычно оставляю ее на конец дня, пока гуляю час (так что могу только догадываться, что это займет около получаса). Так что я понимаю, почему это невозможно для работы и тестирования.

Для работы и тестирования у меня есть другой набор командных файлов для каждого приложения (или модуля или библиотеки), в которых также есть все настройки отладки, но они по-прежнему вызывают одни и те же файлы make. Я могу время от времени отключать DEBUG, а также принимать решение о сборках или изготовлении, или хочу ли я также создавать библиотеки, от которых может зависеть модуль, и так далее.

Пакетный файл также копирует готовый результат в (или в несколько) тестовых папок. В зависимости от настроек это занимает от нескольких секунд до минуты (а не полчаса).

Я использовал другую среду IDE (Zeus), так как мне нравится контролировать такие вещи, как файлы .rc, и на самом деле я предпочитаю компилировать из командной строки, хотя я использую компиляторы MS.

С радостью выложу пример этого командного файла, если кому-то интересно.

Одна более дешевая альтернатива Xoreax IB - это использование так называемых сборок сверхфайловых файлов. По сути, это файл .cpp с

#include "file1.cpp"
#include "file2.cpp"
....
#include "fileN.cpp"

Затем вы компилируете модули uber вместо отдельных модулей. Мы видели время компиляции от 10-15 минут до 1-2 минут. Возможно, вам придется поэкспериментировать с тем, сколько #includes в uber-файле имеет смысл. Зависит от проектов. и т.д. Может быть вы включаете 10 файлов, может быть, 20.

Вы платите определенную сумму, поэтому будьте осторожны:

  1. Вы не можете щелкнуть файл правой кнопкой мыши и сказать «скомпилировать ...», так как вам нужно исключить отдельные файлы cpp из сборки и включить только файлы uber cpp
  2. Вы должны быть осторожны с конфликтами статических глобальных переменных.
  3. Когда вы добавляете новые модули, вы должны поддерживать файлы uber в актуальном состоянии.

Это своего рода боль, но для проекта, который в значительной степени статичен с точки зрения новых модулей, первоначальная боль может того стоить. Я видел, как этот метод в некоторых случаях превосходил IB.

Ответ принят как подходящий

Команда Chromium.org перечислила несколько вариантов для ускорение сборки (на этом этапе примерно на полпути вниз по странице):

In decreasing order of speedup:

  • Install Microsoft hotfix 935225.
  • Install Microsoft hotfix 947315.
  • Use a true multicore processor (ie. an Intel Core Duo 2; not a Pentium 4 HT).
  • Use 3 parallel builds. In Visual Studio 2005, you will find the option in Tools > Options... > Projects and Solutions > Build and Run > maximum number of parallel project builds.
  • Disable your anti-virus software for .ilk, .pdb, .cc, .h files and only check for viruses on modify. Disable scanning the directory where your sources reside. Don't do anything stupid.
  • Store and build the Chromium code on a second hard drive. It won't really speed up the build but at least your computer will stay responsive when you do gclient sync or a build.
  • Defragment your hard drive regularly.
  • Disable virtual memory.

Под отключением виртуальной памяти я предполагаю, что вы имеете в виду отключить подкачку, отключение виртуальной памяти потребует перезаписи всей ОС; p

Joseph Garvin 21.07.2010 20:05

Это похоже на ответ, направленный на сборки C++, а не сборки C#.

Ian Ringrose 25.03.2011 15:26

Ты прав! Хотя я должен отметить, что я ответил до того, как он указал C#, и некоторые исправления все еще применимы.

Nate 25.03.2011 21:39

* Сохраните проект на SSD-диске. * Отключите индексацию Windows (в файловом менеджере щелкните правой кнопкой мыши папку решения, Свойства-> Дополнительно, снимите флажок «Разрешить файлы ... проиндексированы ...»)

nos 24.09.2014 11:41

+1 Если у вас достаточно оперативной памяти, они сохраняют проект на RAM-диске. Это может значительно повысить производительность до 50-70%. проверьте codeproject.com/Articles/197663/Speed-up-Visual-Studio-Build‌ s для получения дополнительной информации

Arjun Vachhani 04.04.2015 14:17

Вы также можете проверить наличие циклических ссылок на проекты. Однажды для меня это было проблемой.

То есть:

Проект A ссылается на проект B

Проект B ссылается на проект C

Проект C ссылается на проект A

Если бы это было так, решение никогда бы не компилировалось.

Michael 24.02.2012 21:19

@Michael будет компилироваться, если вы укажете dll в каталоге отладки вместо использования ссылок на проекты.

Caleb Jares 03.01.2016 06:33

Хорошие предложения, которые помогли до сих пор (не говоря уже о том, что ниже нет других хороших предложений, если у вас есть проблемы, я рекомендую прочитать то, что нам помогло)

  • Новый ноутбук с тактовой частотой 3 ГГц - сила потери нагрузки творит чудеса, когда мы обращаемся к руководству
  • Отключить антивирус во время компиляции
  • `` Отключение '' от VSS (фактически от сети) во время компиляции - я могу заставить нас полностью удалить интеграцию VS-VSS и придерживаться пользовательского интерфейса VSS.

По-прежнему не копирует компиляцию, но помогает каждый бит.

Мы также тестируем практику создания новых областей приложения в новых решениях, при необходимости импортируя новейшие библиотеки DLL и интегрируя их в более крупное решение, когда мы довольны ими.

Мы также можем сделать то же самое с существующим кодом, создав временные решения, которые просто инкапсулируют области, над которыми нам нужно работать, и выбрасывая их после реинтеграции кода. Нам нужно взвесить время, необходимое для реинтеграции этого кода, и время, которое мы выиграем, не имея опыта быстрой перекомпиляции в процессе разработки, как у Рип Ван Винкля.

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

Выключите антивирус. Это увеличивает время компиляции.

... для папки кода / компиляции. Превращение антивирусной защиты в правило общего охвата - не лучшая идея. : o)

Brett Rigby 05.02.2010 12:10

На самом деле вам не нужно его выключать, обычно достаточно его правильно настроить. Добавьте исключения для типов файлов, с которыми работает компилятор / компоновщик. В некоторых антивирусных пакетах эти исключения добавлены по умолчанию, в некоторых - нет.

darklon 16.09.2010 16:32

@cornelius Какая правильная конфигурация антивируса? Вы можете предоставить подробности? (может в отдельный вопрос?)

Pavel Radzivilovsky 30.01.2011 19:22

@Pavel: Ну, исключите типы файлов, с которыми работает компилятор, для C++ это будут такие вещи, как .o, .pdb, .ilk, .lib, .cpp, .h. Кроме того, некоторые антивирусные программы (например, Avira AntiVir) позволяют настроить сканирование файлов на чтение, запись или и то, и другое. Настройка сканирования при чтении даст вам 99% защиту.

darklon 11.02.2011 01:25

У нас было более 80 проектов в нашем основном решении, создание которых занимало от 4 до 6 минут, в зависимости от того, на какой машине работал разработчик. Мы посчитали, что это слишком долго: каждый тест действительно съедает ваши FTE.

Итак, как сократить время сборки? Как вы, кажется, уже знаете, время сборки сильно ухудшает количество проектов. Конечно, мы не хотели избавляться от всех наших проектов и просто объединять все исходные файлы в один. Но у нас было несколько проектов, которые мы, тем не менее, могли объединить: поскольку каждый «проект репозитория» в решении имел свой собственный проект unittest, мы просто объединили все проекты unittest в один проект global-unittest. Это сократило количество проектов примерно до 12 и каким-то образом сэкономило 40% времени на создание всего решения.

Однако мы думаем о другом решении.

Вы также пробовали настроить новое (второе) решение с новым проектом? Это второе решение должно просто включать все файлы, использующие папки решения. Потому что вы можете быть удивлены, увидев время сборки этого нового решения с одним проектом.

Однако работа с двумя разными решениями требует особого внимания. Разработчики могут быть склонны фактически работать во втором решении и полностью игнорировать первое. Поскольку первое решение с более чем 70 проектами будет решением, которое заботится о вашей иерархии объектов, это должно быть решение, в котором ваш сервер сборки должен запускать все ваши модульные тесты. Таким образом, сервер для непрерывной интеграции должен быть первым проектом / решением. Вы должны поддерживать свою объектную иерархию, верно.

Второе решение с одним проектом (который будет строиться намного быстрее) будет, чем проект, в котором тестирование и отладка будут выполняться всеми разработчиками. Однако вы должны позаботиться о них, глядя на сервер сборки! Если что-то сломается, это ДОЛЖНО быть исправлено.

Убедитесь, что ваши ссылки являются ссылками на проекты, а не непосредственно на библиотеки DLL в выходных каталогах библиотеки.

Кроме того, установите для них запрет на локальное копирование, кроме случаев крайней необходимости (главный проект EXE).

Вы можете объяснить, почему это быстрее? «Ссылки на проект» подразумевают сборку проекта (что намного больше помедленнее, чем прямая ссылка на DLL).

Gone Coding 11.05.2015 13:01

Отключите индексирование файловой системы в ваших исходных каталогах (в частности, в каталогах obj, если вы хотите, чтобы ваш источник был доступен для поиска)

У меня была аналогичная проблема с решением с 21 проектом и 1/2 миллиона LOC. Самая большая разница заключалась в получении более быстрых жестких дисков. Из монитора производительности «Сред. Disk Queue 'значительно увеличился бы на ноутбуке, указывая на то, что жесткий диск был бутылочным горлышком.

Вот некоторые данные об общем времени восстановления ...

1) Ноутбук, Core 2 Duo 2 ГГц, привод 5400 об / мин (не уверен в кеш-памяти. Был стандартным Dell inspiron).

Время восстановления = 112 секунд.

2) Настольный компьютер (стандартная версия), Core 2 Duo 2,3 ГГц, один диск 7200 об / мин, 8 МБ кэш-памяти.

Время восстановления = 72 секунды.

3) Desktop Core 2 Duo 3Ghz, одиночный WD Raptor, 10000 об / мин

Время восстановления = 39 секунд.

Привод на 10 000 об / мин нельзя недооценивать. Сборки были значительно быстрее, плюс все остальное, например, отображение документации, использование файлового проводника было заметно быстрее. Это был большой прирост производительности за счет ускорения цикла код-сборка-выполнение.

Учитывая, сколько компании тратят на зарплату разработчиков, это безумный, сколько они могут потратить на покупку того же ПК, что и администратор.

Как SSD по сравнению с raptor. Еще быстрее я угадаю

RvdK 27.05.2010 12:48

Ага. Мой ноутбук с Intel X25M во всех отношениях быстрее моего настольного компьютера с WD Raptor.

CAD bloke 04.09.2010 08:56

Это может показаться удивительным, но в настоящее время не стоит инвестировать в привод на 10000 об / мин. Причина в том, что лучшие диски 7200 об / мин быстрее на внешнем ободе. Итак, что нужно сделать, это создать небольшой раздел. Первый раздел находится на внешнем ободе, этот раздел будет быстрее, чем диск со скоростью 7200 об / мин, плюс у вас все еще есть место для второго большого раздела для хранения вещей.

darklon 16.09.2010 16:22

Кроме того, вы также можете разместить решение на RAM-диске и вдвое сократить время восстановления. Просто совершайте почаще;)

keyle 06.06.2011 13:25

@cornelius: могу я получить ссылку, которая разъясняет вашу точку зрения? Единственный способ, которым внешний обод 7200 мог быть быстрее, чем внешний обод 10000, был бы, если бы 7200 имели тенденцию к радиусу, что, возможно, могло быть, но на самом деле этот трюк был бы своего рода хакерством и не принесет пользы. для остальной части жесткого диска 7200, который находится ниже равновесного радиуса, при котором два диска имеют одинаковую тангенциальную скорость.

eremzeit 09.08.2011 22:55

Я с CADbloke. Мы использовали raptors до прошлого года, когда цена на твердотельные накопители снизилась до такой степени, что мы использовали твердотельные накопители только для основных дисков в наших ноутбуках / настольных компьютерах. Увеличение скорости просто фантастическое, и это, пожалуй, самый важный фактор, влияющий на время компиляции наших решений.

NotMe 18.12.2013 18:54

Конечно, есть проблема с VS2008. Потому что единственное, что я сделал, - это установил VS2008 для обновления моего проекта, созданного с помощью VS2005. В моем решении всего 2 проекта. Он не большой. Компиляция с VS2005: 30 секунд Компиляция с VS2008: 5 минут

Там должна быть другая проблема, 2 проекта должны нормально работать на приличной машине

johnc 31.03.2009 22:21

Если это проект C++, вам следует использовать предварительно скомпилированные заголовки. Это дает огромную разницу во времени компиляции. Не уверен, что на самом деле делает cl.exe (без использования предварительно скомпилированных заголовков), похоже, он ищет лоты заголовков STL во всех неправильных местах, прежде чем, наконец, перейти в правильное место. Это добавляет целые секунды к каждому компилируемому файлу .cpp. Не уверен, что это ошибка cl.exe или какая-то проблема STL в VS2008.

Глядя на машину, на которой вы строите, оптимально ли она сконфигурирована?

Мы только что получили время сборки нашего крупнейшего продукта корпоративного масштаба на C++ с 19 часов до 16 минут, убедившись, что установлен правильный драйвер фильтра SATA.

Тонкий.

Скорость движения, безусловно, является важным фактором

johnc 02.12.2009 00:11

Не оптимально настроен. 2 ГБ ОЗУ - это слишком мало для начала.

TomTom 15.09.2010 02:44

Я заметил, что этому вопросу давно, но тема все еще актуальна. Та же проблема укусила меня в последнее время, и две вещи, которые больше всего улучшили производительность сборки: (1) использовать выделенный (и быстрый) диск для компиляции и (2) использовать одну и ту же папку вывода для всех проектов и установить CopyLocal на False в проекте Рекомендации.

Некоторые дополнительные ресурсы:

В Visual Studio 2005 есть недокументированный переключатель / MP, см. http://lahsiv.net/blog/?p=40, который позволяет выполнять параллельную компиляцию на файловой основе, а не на основе проекта. Это может ускорить компиляцию последнего проекта или, если вы компилируете один проект.

Некоторые инструменты анализа:

инструменты-> параметры-> Настройки проекта VC++ -> Время сборки = Да сообщит вам время сборки для каждого vcproj.

Добавьте переключатель /Bt в командную строку компилятора, чтобы увидеть, сколько занимает каждый файл CPP

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

Это поможет вам оптимизировать производительность компилятора, устранив зависимости и проблемы с производительностью.

Прежде чем тратить деньги на приобретение более быстрых жестких дисков, попробуйте создать свой проект полностью на RAM-диске (при условии, что у вас есть свободная RAM). Вы можете найти в сети различные бесплатные драйверы для RAM-диска. Вы не найдете ни одного физического диска, в том числе SSD, который был бы быстрее, чем RAM-диск.

В моем случае проект, на создание которого потребовалось 5 минут на 6-ядерном i7 на диске SATA 7200 об / мин с Incredibuild, был сокращен всего примерно на 15 секунд за счет использования RAM-диска. Учитывая необходимость повторного копирования в постоянное хранилище и возможность потери работы, 15 секунд - недостаточный стимул для использования RAM-диска и, вероятно, не большой стимул тратить несколько сотен долларов на высокоскоростной или SSD-накопитель.

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

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

По моему опыту, RAM-диски не помогают во времени сборки VS, и они доставляют боль, потому что вам нужно воссоздавать их каждый раз, когда ваш компьютер перезагружается или выходит из строя. См. Сообщение в блоге здесь: josephfluckiger.blogspot.com/2009/02/…

BrokeMyLegBiking 15.09.2011 15:56

При выборе ЦП: размер кэша L1, похоже, имеет огромное влияние на время компиляции. Кроме того, обычно лучше иметь 2 быстрых ядра, чем 4 медленных. Visual Studio не очень эффективно использует дополнительные ядра. (Я основываю это на своем опыте работы с компилятором C++, но, вероятно, это также верно и для компилятора C#.)

Я также теперь убежден, что есть проблема с VS2008. Я запускаю его на двухъядерном ноутбуке Intel с 3G Ram, с выключенным антивирусом. Компиляция решения часто бывает довольно гладкой, но если я занимался отладкой, последующая перекомпиляция часто замедлялась до обхода. По непрерывному свету индикатора основного диска видно, что существует узкое место ввода-вывода на диске (вы также можете это услышать). Если я отменяю сборку и завершаю работу VS, активность диска прекращается. Перезапустите VS, перезагрузите решение, а затем перестройте, и это намного быстрее. Unitl в следующий раз

Я считаю, что это проблема с подкачкой памяти - VS просто заканчивается память, и O / S начинает подкачку страниц, чтобы попытаться освободить место, но VS требует больше, чем может дать подкачка страниц, поэтому он замедляется до обхода. Я не могу придумать другого объяснения.

VS определенно не является инструментом RAD, не так ли?

У меня тоже была эта проблема с VS2005 - определенно пейджинг

johnc 06.10.2010 02:13

Насколько велик ваш каталог сборки после завершения сборки? Если вы придерживаетесь настройки по умолчанию, то каждая сборка, которую вы создаете, будет копировать все библиотеки DLL своих зависимостей и зависимостей зависимостей и т. д. В свой каталог bin. В моей предыдущей работе, когда я работал с решением для ~ 40 проектов, мои коллеги обнаружили, что самой дорогой частью процесса сборки было многократное копирование этих сборок, и что одна сборка может генерировать гигабайты копий одних и тех же библиотек DLL снова и снова. снова.

Вот несколько полезных советов от Патрика Смаккиа, автора NDepend, о том, что, по его мнению, должно и не должно быть отдельными сборками:

http://codebetter.com/patricksmacchia/2008/12/08/advices-on-partitioning-code-through-net-assemblies/

Есть два основных способа обойти эту проблему, и у обоих есть недостатки. Один из них - уменьшить количество сборок, что, очевидно, требует больших усилий. Другой вариант - реструктурировать каталоги сборки, чтобы все папки bin были объединены, а проекты не копировали библиотеки DLL своих зависимостей - в этом нет необходимости, потому что все они уже находятся в одном каталоге. Это значительно сокращает количество файлов, создаваемых и копируемых во время сборки, но это может быть сложно настроить и может вызвать некоторые трудности при извлечении только тех библиотек DLL, которые требуются конкретному исполняемому файлу для упаковки.

Я уволился с работы, потому что это было проблемой некоторое время назад, но на моей новой должности это именно то, что мы реализовали! Ваше здоровье. JC

johnc 10.01.2011 23:51

Есть несколько вещей, которые я нашел полезными для ускорения сборки C# / .NET:

  • Объединяйте небольшие проекты в более крупные, поскольку создание решения сопряжено с большими накладными расходами на каждый проект. (Используйте nDepend, если необходимо управлять вызовами между уровнями)

  • Сделайте так, чтобы все наши проекты были встроены в какой-либо выходной каталог, а затем установите для параметра «copy local» значение false для всех ссылок на проекты - это может привести к большому ускорению из-за сокращения операций ввода-вывода.

  • Включите антивирусную программу, чтобы увидеть, насколько она важна; в таком случае найдите более быстрая проверка на вирусы или исключите "горячие" папки из проверки антивирусной программой.

  • Используйте perforce monitor и внутренний инструмент sys, чтобы увидеть, как долго ваши компиляции занимают столько времени.

  • Рассмотрим RAM-диск, на котором можно разместить выходной каталог.

  • Рассмотрите возможность использования SSD

  • Иногда больший объем памяти может иметь большое значение - (уменьшите количество плунжера в машине, если вы сильно замедлились, удалив небольшой плунжер, вы можете получить большую скорость, добавив больше) Удалите ненужные ссылки на проекты (возможно, сначала вам придется удалить ненужные «использования»)

  • Рассмотрите возможность использования инфраструктуры внедрения зависимостей и интерфейсов для самого нижнего уровня домена, поэтому перекомпиляция всего требуется только при изменении интерфейса - это может не сильно выиграть в зависимости от того, как часто интерфейс изменяется.

Инструкции по сокращению времени компиляции Visual Studio до нескольких секунд

К сожалению, Visual Studio недостаточно умен, чтобы отличить изменения интерфейса сборки от несущественных изменений тела кода. Этот факт в сочетании с большим количеством взаимосвязанных решений может иногда создавать идеальный шторм нежелательных «полных сборок» почти каждый раз, когда вы меняете одну строку кода.

Стратегия преодоления этого - отключить автоматическое построение ссылочного дерева. Для этого используйте Configuration Manager (Build / Configuration Manager ... затем в раскрывающемся списке Active solution configuration выберите New), чтобы создать новую конфигурацию сборки под названием «ManualCompile», которая копирует из конфигурации Debug, но не устанавливайте флажок "Создать новые конфигурации проекта". В этой новой конфигурации сборки снимите флажки у всех проектов, чтобы ни один из них не собирался автоматически. Сохраните эту конфигурацию, нажав «Закрыть». Эта новая конфигурация сборки добавляется в ваш файл решения.

Вы можете переключиться с одной конфигурации сборки на другую с помощью раскрывающегося списка конфигурации сборки в верхней части экрана IDE (того, который обычно показывает либо «Отладка», либо «Выпуск»). Фактически эта новая конфигурация сборки ManualCompile сделает бесполезными пункты меню «Сборка» для: «Построить решение» или «Перестроить решение». Таким образом, когда вы находитесь в режиме ManualCompile, вы должны вручную построить каждый проект, который вы изменяете, что можно сделать, щелкнув правой кнопкой мыши каждый затронутый проект в обозревателе решений, а затем выбрав «Сборка» или «Перестроить». Вы должны увидеть, что общее время компиляции теперь будет составлять всего несколько секунд.

Чтобы эта стратегия работала, необходимо, чтобы VersionNumber, находящийся в файлах AssemblyInfo и GlobalAssemblyInfo, оставался статичным на компьютере разработчика (конечно, не во время сборок выпуска), и чтобы вы не подписывали свои библиотеки DLL.

Потенциальный риск использования этой стратегии ManualCompile заключается в том, что разработчик может забыть скомпилировать необходимые проекты, и при запуске отладчика они получают неожиданные результаты (невозможно подключить отладчик, файлы не найдены и т. д.). Чтобы избежать этого, вероятно, лучше всего использовать конфигурацию сборки Debug для компиляции большего объема кода и использовать конфигурацию сборки ManualCompile только во время модульного тестирования или для внесения быстрых изменений, которые имеют ограниченный объем.

У нас есть почти 100 проектов в одном решении, а время сборки составляет всего секунды :)

Для локальных сборок разработки мы создали надстройку Visual Studio, которая изменяет Project references на DLL references и выгружает нежелательные проекты (и, конечно же, возможность переключить их обратно).

  • Соберите все наше решение однажды
  • Выгрузите проекты, над которыми мы сейчас не работаем, и замените все ссылки на проекты ссылками на библиотеки DLL.
  • Перед регистрацией измените все ссылки с DLL на ссылки проекта.

Наши сборки теперь занимают всего несколько секунд, когда мы работаем только над несколькими проектами одновременно. Мы также можем отлаживать дополнительные проекты, поскольку они связаны с отладочными библиотеками DLL. Инструмент обычно занимает 10-30 секунд, чтобы внести большое количество изменений, но вам не нужно делать это так часто.

Обновление май 2015 г.

Сделка, которую я заключил (в комментариях ниже), заключалась в том, что я выпущу плагин с открытым исходным кодом если, это вызывает достаточный интерес. Спустя 4 года у него всего 44 голоса (а у Visual Studio теперь есть две последующие версии), так что в настоящее время это проект с низким приоритетом.

Также использовал эту технику, с решением, имеющим 180 проектов. Это очень помогло. Вы даже можете использовать командную строку для создания всего решения `devenv.exe / build yoursolution / takealookatthedoc`` ... так что вы работаете только с несколькими проектами, а при необходимости вы перекомпилируете все решение в строке cmd (после получить последнюю версию, например)

Steve B 17.09.2011 14:06

У вас есть ссылки, описывающие, как это делается? Я не имею в виду писать плагин VS. Скорее, конкретные описанные задачи

Daniel Dyson 11.02.2012 19:54

@ Дэниел Дайсон: Насколько подробно вам нужно знать? Все сводится к 1) загрузке любых выгруженных проектов 2) повторению иерархии решений / проектов / ссылок 3) поиску проектов со ссылками на другие проекты 4) изменению «выбранных» ссылок на ссылки DLL (с ​​правильными путями подсказок), затем 5) выгрузка нежелательных проектов. «Выбрано» можно либо через меню содержимого (т.е. выбранные проекты (проекты)), либо через дерево флажков для выбора элементов.

Gone Coding 13.02.2012 13:21

Спасибо. Этого должно быть достаточно, чтобы я начал.

Daniel Dyson 13.02.2012 16:51

@HiTechMagic неплохо бы опубликовать свой аддин :)

Michel 22.02.2012 12:07

@Michel: Я договорился с кем-то, что, если этот ответ наберет приличный счет, я выпущу версию надстройки для общего использования ... однако он находится здесь уже 7 месяцев и имеет счет от 5 до- дата ... Может быть, Дэниел Дайсон (вверху) опередит меня :)

Gone Coding 22.02.2012 15:39

@HiTechMagic +1 Я бы хотел получить копию этого плагина, если вы можете ею поделиться.

Brandon Moore 15.06.2012 11:40

@HiTechMagic Звучит хорошо. У вас есть веб-сайт, на котором я могу проверить его выпуск, или мне просто придется каждый месяц писать здесь комментарии? :)

Brandon Moore 17.06.2012 02:26

@Brandon Moore: Ссылка на веб-сайт должна быть в моих пользовательских данных. Спасибо

Gone Coding 17.06.2012 14:22

@HiTechMagic - Мне тоже хотелось бы увидеть это дополнение. (Даже если он не отполирован, это было бы очень хорошей отправной точкой.)

Vaccano 04.02.2013 22:35

В настоящее время ведется работа по обновлению и выпуску этого инструмента. Другой пользователь SO недавно присоединился к проекту, чтобы сдвинуть его с мертвой точки (как для VS 2012, так и для 2012, но не планирует выпускать версию 2008).

Gone Coding 22.03.2013 12:48

@georgiosd: мой коллега-пользователь SO прекратил общение, как только получил доступ к исходному коду, поэтому проект не продвинулся дальше. Иди разберись. Вместо этого я мог бы подумать о выпуске его как с открытым исходным кодом (мне нужно будет убедиться, что в нем не осталось стороннего кода).

Gone Coding 11.08.2013 04:18

@HiTechMagic Ах, жаль это слышать. Но да, выпуск его с открытым исходным кодом означает, что мы все можем помочь. Пожалуйста, разместите здесь ссылку на github, если вы ее выпустите.

georgiosd 11.08.2013 12:40

Этот плагин когда-нибудь выходил?

Rohit Vipin Mathews 11.05.2015 09:34

@Rohit: Прошло почти 4 года и всего 44 голоса за, так что это не было приоритетом. У трех коллег, которых мы наняли, которые могли бы помочь, все вышли из строя и ушли :( Мне не нравится идея выкладывать на GitHub что-то, что находится в плохом состоянии, но сейчас это может быть единственным вариантом.

Gone Coding 11.05.2015 10:03

Это печально, я подумал, что это отличная идея.

Rohit Vipin Mathews 11.05.2015 10:11

Я обнаружил, что следующее помогает скорости компиляции: после многократных компиляций (итеративная разработка в памяти) я бы покинул VS2008. Затем перейдите в каталоги проекта и удалите все папки obj и bin, запустите проект обратно, и мое время компиляции резко упало. Это похоже на действие Clean solution в VS2008.

Просто хочу подтвердить, полезно ли это для кого-либо.

Я нашел свое исправление здесь: http://blogs.msdn.com/b/vsdteam/archive/2006/09/15/756400.aspx

Для сборок C# .NET вы можете использовать .NET Demon. Это продукт, который берет на себя процесс сборки Visual Studio, чтобы сделать его быстрее.

Он делает это путем анализа внесенных вами изменений и строит только тот проект, который вы действительно изменили, а также другие проекты, которые фактически основывались на внесенных вами изменениях. Это означает, что если вы измените только внутренний код, нужно будет построить только один проект.

Разве это не то, что уже делает VS? Или вы имеете в виду, что нерелевантные изменения, такие как комментарии и т. д., Отбрасываются?

nawfal 31.12.2013 10:50

Redgate, к сожалению, остановил работу над демоном .net, поэтому он не работает над VS 2013.

Robert Ivanc 05.03.2015 12:42

Ваша компания случайно не использует Entrust для своего решения PKI / Encryption? Оказывается, у нас была ужасная производительность сборки для довольно большого веб-сайта, созданного на C#, что занимало 7+ минут на Rebuild-All.

Моя машина - i7-3770 с оперативной памятью 16 ГБ и SSD на 512 ГБ, поэтому производительность не должна быть такой плохой. Я заметил, что время моей сборки было безумно быстрее на старом вторичном компьютере с той же кодовой базой. Поэтому я запустил ProcMon на обеих машинах, профилировал сборки и сравнил результаты.

И вот, у медленной машины было одно отличие - ссылка на Entrust.dll в трассировке стека. Используя эту недавно полученную информацию, я продолжил поиск в StackOverflow и нашел это: MSBUILD (VS2010) очень медленный на некоторых машинах. Согласно принятому ответу проблема заключается в том, что обработчик Entrust обрабатывал проверки сертификатов .NET вместо собственного обработчика Microsoft. Также предполагается, что Entrust v10 решит эту проблему, которая преобладает в Entrust 9.

В настоящее время он удален, и время сборки упало до 24 секунды. YYMV с количеством проектов, которые вы в настоящее время создаете, и не может напрямую решать проблему масштабирования, о которой вы спрашивали. Я опубликую изменение этого ответа, если смогу предоставить исправление без, прибегнув к удалению программного обеспечения.

Низкая производительность Visual Studio… Решено! 24 сентября 2014 г., Узма Абиди

Сегодня у меня возникла странная проблема, связанная с производительностью. Моя Microsoft Visual Studio, похоже, занимала слишком много времени, чтобы выполнять даже самые простые операции. Я погуглил и попробовал несколько идей, которые были у людей, такие как отключение надстроек или очистка списка последних проектов Visual Studio, но эти предложения, похоже, не помогли решить проблему. Я вспомнил, что на веб-сайте Windows SysInternals есть инструмент под названием Process Monitor, который отслеживал доступ к реестру и файлам любой запущенной программой. Мне казалось, что Visual Studio что-то замышляет, и Process Monitor должен помочь мне понять, что это было. Я загрузил самую последнюю версию и, немного поигравшись с фильтрами отображения, запустил ее и, к своему ужасу, увидел, что Visual Studio работает так медленно, потому что имеет доступ к более чем 10 000 папок в C: \ Users \ krintoul \ AppData \ Local \ Microsoft \ WebSiteCache для большинства операций IDE. Я не уверен, почему было так много папок и, более того, я не знал, что Visual Studio делает с ними, но после того, как я заархивировал эти папки и переместил их в другое место, производительность Visual Studio значительно улучшилась.

На веб-сайте Windows SysInternals есть ряд других полезных утилит для управления сетью, безопасности, системной информации и многого другого. Проверить это. Я уверен, что ты найдешь что-нибудь ценное.

Другие вопросы по теме