Ускоряем Visual Studio, часть II. Эксперименты с компиляциейИсточник: habrahabr habrahabr
Ускоряем Visual Studio, часть II. Эксперименты с компиляциейVisual Studio
Мой основной рабочий инструмент на протяжении вот уже 10 лет это Microsoft Visual Studio. Это прекрасная IDE (по крайней мере для С++ и С#), лучше которой для Desktop-разработки под Windows я не знаю. Тем не менее, общеизвестен один её недостаток - падение производительности на больших решениях. Я сейчас работаю над решением из 19-ти проектов (около 4к файлов, 350к строк кода). Компиляция и прочие издержки съедают изрядное количество времени. Именно поэтому я задался целью провести масштабное исследование путей повышения скорости работыVisual Studio, отделив мифы от реальности.
Сразу скажу, что в финале мне удалось добиться сокращения времени компиляции решения с 4:24 минут до менее чем одной минуты. Детали под катом.
На старт!В начале я собирался собрать отдельную тестовую машину с "чистой" ОС и одной лишь установленной программой - Visual Studio. Но потом решил, что тестировать сферических коней в вакууме будет не совсем верно. На компьютере программиста так или иначе будут установлены какой-нибудь браузер, антивирус, файловый менеджер, архиватор, текстовый редактор и т.д., а значит Студии придется работать со всем этим по близости. Значит, в таком режиме и будем её тестировать, на обычном компьютере разработчика (переустановив, правда, ради чистоты эксперимента, операционную систему и поставив свежие версии используемых в работе программ). Набор экспериментов составлен по советом с сайтов Stackoverfow, RSDN, форумов MSDN, выдачи Google ну и просто из головы. Объектом тестирования станет время полной компиляции решения. Перед каждым экспериментом вся папка проекта будет удаляться, код будет заново заливаться из репозитория, а Visual Studio перезагружаться. Каждый эксперимент будет повторяться трижды, результатом будет среднее время. После каждого эксперимента сделанные изменения откатываются. Если кому-нибудь интересна аппаратная конфигурация моего компьютера, так вот она: Исходное время компиляции моего решения: 4 минуты 24 секунды
Поехали!Временные файлы - на RamDriveЕсть мнение, что самые медленные операции во время компиляции решения связаны с доступом к диску. Уменьшить это время можно путем использования RamDrive для временных файлов. Результат: 4 минуты 13 секунд или -4.17% ко времени компиляции. Вывод: прирост производительности имеется, хоть и небольшой. Если количество ОЗУ позволяет, этот совет можно применять в деле.
Весь проект - на RamDriveКоль уж нам удалось немного ускорить компиляцию за счет выноса на RamDrive временных файлов, возможно получиться добиться еще лучших результатов, переместив туда всё решение (всё-таки более 4000 файлов). Результат: 3 минуты 47 секунд или -14.02% ко времени компиляции. Вывод: По началу этот эксперимент показался мне немного стрёмным - хранить исходники в оперативной памяти не лучший вариант (а вдруг пропадет питание?). Но, учитывая факт наличия бесперебойников, равно как и таких версий RamDrive, как от QSoft (с автоматическим дублированием измененных файлов с RamDrive на жесткий диск) убедили меня, что вариан возможен. Нужно только достаточно ОЗУ (и, по-хорошему, 64-битная ОС).
Весь проект - на флешкуПродолжая рассуждения о скорости поиска файлов на диске и более производительных операциях случайного доступа для USB-носителей, попробуем поместить весь проект на флешку и скомпилировать его там. Результат: 20 минут и 5 секунд или +356.44% ко времени компиляции Вывод: самый провальный эксперимент. Флешка не в состоянии справиться с тем шквалом операций ввода\вывода, которые совершается при компиляции.
Включение функции ReadyBoost в WindowsMicrosoft расхваливает эту функцию именно за повышение производительности при работе с большим количеством относительно небольших блоков данных (наш вариант). Попробуем. Результат: 4 минуты 17 секунд или -2.65% ко времени компиляции. Вывод: вполне нормальный способ ускорения работы. Кроме необходимости 1 раз вставить флешку и настроить ReadyBoost других недостатков не имеет, а некоторый прирост производительности даёт.
Изменение количества одновременно компилирующихся проектовVisual Studio при установке прописывает это число равным общему количеству ядер процессоров в Вашем ПК. Тем не менее, мы можем попробовать его изменить (делается это в настройках VS для С++ проектов) и оценить изменение производительности. Так как в моём компьютере 4-ядерный процессор, изначально это число было равным четырём. Результат: 6 проектов компилируются одновременно - 4 минуты 34 секунды или +3.79% ко времени компиляции 2 проекта компилируется одновременно - 4 минуты 21 секунда или -1.14% ко времени компиляции Вывод: я с самого начала ожидал, что увеличение числа одновременно компилирующихся проектов не даст никакого прироста производительности (так и вышло). Но вот почему уменьшение его до двух дало небольшой прирост для меня не очень понятно. Возможно, это просто статистическая погрешность, а может быть при компиляции 4-ех проектов Студия из-за их зависимостей теряет время на каком-то ожидании, что происходит реже при компиляции всего двух проектов. Если у кого-нибудь еще есть мысли по теме - прошу в комментарии.
Отключение вывода текста билда в окно ОutputМеньше вывода текста при компиляции - быстрее результат. Результат: 4 минуты 22 секунды или -0.76% ко времени компиляции Вывод: прирост столь смехотворен, что не стоит даже комментариев. Он может быть как реальным, так и случайным.
Очистка корзиныЯ вычитал этот совет на Stackoverflow. Аргументация была в том, что по ходу компиляции создаётся и удаляется масса мелких файлов, а процедура удаления в Windows работает медленнее при забитой корзине. Поскольку все предыдущие эксперименты я и так проводил при пустой корзине, мне пришлось проделать обратный эксперимент - положить в корзину 5000 файлов общим объёмом в 2 Гб. Результат: 4 минуты 23 секунды или +0.38% ко времени компиляции. Вывод: время компиляции осталось без изменений. Теория провалилась.
Ключ компилятора /MPКлюч /MP - это тоже параллельная компиляция, но уже не проектов в решении, а файлов внутри каждого проекта. Результат: 2 минуты 38 секунд или -40.15% ко времени компиляции Вывод: это одно из самых существенных достижений среди всех поставленных экспериментов. Конечно, прирост столь высок в основном из-за 4-ядерности моего процессора, но вскоре такие (и еще более-ядерные процессоры) станут нормой в любом компьютере, так что включать опцию имеет смысл. При её включении компилятор честно предупреждает, что она не совместимо с ключом /Gm (Enable Minimal Rebuild), что вначале пугает - возникает мысль, что теперь при любом изменении любого файла будет происходить полная перекомпиляция решения. Так вот - нифига подобного! После изменения одного файла с кодом, как и ранее, будет перекомпилироваться только этот файл, а не всё решение. Всё, что делает ключ - это определяет выбор алгоритма определения взаимосвязей файлов кода и файлов заголовков в проекте (детальнее). Оба алгоритма неплохи и существенный прирост производительности от включения /MP во много раз превосходит недостатки от отключения /Gm.
Удаление папки решения из индекса поиска WindowsЕсть мнение, что изменение файлов в папках, которые индексируются механизмом поиска ОС Windows, приводит к увеличению времени компиляции. Результат: 4 минуты 24 секунды или никакого изменения во времени компиляции Вывод: то ли индексирование в Windows сделано так хорошо, что вообще не замедляет работу других программ с диском, то ли это влияние минимально, то ли мне просто повезло и компиляция не совпала по времени с индексацией.
Unity BuildsОб этом механизме я рассказывал в прошлой статье. Результат: 3 минуты 24 секунды или -22.73% ко времени компиляции. Вывод: сокращение времени компиляции существенно. О всех достоинства и недостатках этой методики я уже писал, использовать его или нет Вы можете решить сами.
Завершение лишних программРаботающие параллельно со Студией программы кушают память и ресурсы процессора. Их закрытие может положительно сказаться на скорости работы Студии. Итак, я закрываю Skype, QIP, Dropbox, GTalk, DownloadMaster, Mysql server. Результат: 4 минуты 15 секунд или -3.41% ко времени компиляции Вывод: во время компиляции придется обойтись без других программ. Никаких анекдотов и порнухи "пока оно там компилится". Вряд ли полный отказ от всех программ возможен для разработчика, но можно создать бат-файлы, включающие\выключащие все лишнее и иногда ими пользоваться.
Отключение антивирусаЕсли у Вас в системе установлен антивирус, то эта Результат: 3 минуты 32 секунды или -19.07% ко времени компиляции Вывод: удивительный результат. Я почему-то был уверен, что все эти *.cpp. *.h, *.obj файлы полностью антивирусом игнорируются и внимания удостоятся только скомпилированные исполняемые программы, что не очень сильно замедлит работу. Однако, факт налицо - почти минута времени экономии.
Дефрагментация жесткого дискаФайловые операции выполняются быстрее на дефрагментированом диске, а компиляция - это огромное количество файловых операций. Я специально оставил этот эксперимент напоследок, поскольку отменить дефрагментацию диска невозможно, а я хотел сделать эксперименты максимально независимыми. Результат: 4 минуты 8 секунд или -6.06% ко времени компиляции Вывод: практика согласуется с теорией. Поставьте себе дефрагментацию в планировщик и почаще.
Способы, которые, вероятно, помогли бы, но попробовать не вышло
Переход на 64-битную версию WindowsЕсть предположение, что это дало бы некоторый прирост производительности, но портирование нашего проекта под x64, в силу его специфики, имеет не очень высокий приоритет и пока не реализовано. Соответственно, пока что нечего и тестировать.
Обновление процессора, памяти, замена HDD на SSD или RAIDНужно сказать, что моя тестовая машинка не так уж плоха и до планового апгрейда еще далеко. Работаем с тем, что есть. По отзывам в интернете наибольшее влияние на время компиляции оказывает установка SSD.
Вынесение редко меняющихся проектов в отдельное решениеЭто и так уже было сделано. Если в Вашем проекте подобное еще не реализовано - обязательно займитесь.
Xoreax's IncrediBuild или аналогРаспределение компиляции между компьютерами - это уже достаточно кардинальный шаг. Он требует покупки специального ПО, серьёзной настройки и некоторого "выворачивания наизнанку" процесса сборки. Но в очень больших проектах это может стать единственным возможным вариантом. На сайте Xoreax's IncrediBuild есть данные по приросту производительности, рассказы клиентов и куча Это всё, что я хотел рассказать о способах ускорения компиляции решений в Visual Studio, а в следующей статье я приведу несколько советов по ускорению работы самой IDE. |