C++. Секреты быстрой компиляции
Внимание! Этот документ ещё не опубликован.
Автор: @!!ex
Для уменьшения воды в тексте под словом «компиляция» будет подразумеваться полная сборка приложения (все, что происходит между нажатием на F5 и запуском готового приложения).
Введение
Основная масса программистов на С++ принимает долгую компиляцию как должное. Совсем по другому эту ситуацию воспринимают программисты, перешедшие на С++ с других языков, в которых используются быстрые компиляторы (Basic, Delphi). Подход к программированию во многом зависит от скорости компиляции и линковки: если компилятор собирает проект за несколько минут – вы не будете пользоваться им для тестирования небольших изменений, используя же быстрый компилятор вы имеете возможность без потери времени оттестировать практически каждое изменение в коде. Здесь не будет рассматриваться вопрос «зачем нужна быстрая компиляция», здесь я расскажу как сделать С++ компилятор быстрым.
Статья состоит из нескольких разделов, посвященных отдельным инструментам и настройкам, позволяющим ускорить работу компилятора.
Выбор компилятора.
Ничто так не ускоряет работу компилятора как его правильный выбор. Многие программисты выбирают OpenSource-решения в духе MinGW, надеясь сэкономить или из принципиальных побуждений. MinGW весьма медленный компилятор. Intel - немного быстрее. Лучшие результаты по скорости компиляции показывает Microsoft Visual C++. Если хотите еще более быстрой компиляции - отключите все оптимизации.
Precompiled headers
Precompiled headers – это набор заголовочных файлов, которые собираются один раз и при повторной сборке проекта очень быстро линкуются. В список precompiled headers нужно добавлять все те заголовочные файлы, которые содержат стабильный неизменный код или меняются очень редко. Для MSVC++ по умолчанию список этих файлов содержится в stdafx.h, который должен быть подключен во все cpp файлы самым первым.
IncrediBuild
IncrediBuild – инструмент, который интегрируясь в MS Visual Studio, позволяет распараллеливать компиляцию по всем подключенным к IB компьютерам в сети. Безусловно, замечательный инструмент, но с серьезным недостатком: скорость линковки ниже, чем при обычной сборке, да и необходимость рассылать всем исходные коды и получать результат, сказывает отрицательно. Выигрыш в скорости вы получите только если проводите rebuild проекта. При штатной разработке IncrediBuild обычно работает немного медленней обычной компиляции.
Ram Disk
Ram Disk – это виртуальный винчестер, с которым система работает как с обычным винчестером, но физически расположенный в оперативной памяти. Объем такого диска весьма ограничен, но 100 мегабайт достаточно, чтобы хранить все скомпилированное приложение. Использование Ram Disk – один из самых эффективных способов ускорить компиляцию и сборку С++ проекта, в этом случае основная нагрузка ложится на процессор и нет торможения из-за медленной скорости чтения/записи винчестера.
ВАЖНО! Ram Disk – работает с оперативной памятью, а значит любой сбой в работе вашего ПК потенциально может привести к полной потери информации. В связи с чем не стоит переносить исходные коды на Ram Disk, размещайте на нем только сборку.
Qt
Qt - замечательный инструмент для разработки приложений, но входящий в него qmake работает очень медленно. Поработав с этим инструментом, мы пришли к следующему принципу его использования: при разработке кода ядра и кода игры не используется Qt, следовательно не требуется запуск qmake. При этом весь инструментарий использует Qt для интерфейсов и для реализации внутренней логики, не связанной с кодом движка.
Есть в этом некоторое кощунство – использовать Qt как редактор интерфейса, но полноценное использование функционала Qt в разработке игр несет больше проблем, чем реальной пользы.
Модульность
По возможности выделяйте для каждого класса отдельный модуль. Чем меньше кода нужно переработать компилятору – тем быстрее он это сделает. Готовые модули добавляйте в список precompiled headers.
Итоги
Самый быстрый компилятор – Microsoft Visual C++ с полностью отключенными оптимизациями кода.
Для того, чтобы убрать зависимость от скорости работы винчестера, лучше использовать Ram Disk, не забывая при этом периодически сбрасывать исходные коды на винчестер.
IncrediBuild хорошо помогает при rebuild проекта, но в обычной работе только мешает.
Qt – это хорошо, но слишком медленно и для больших игр не годится.
Код разбивайте на логические блоки и по возможности храните эти блоки в отдельных модулях.
Применив эти нехитрые приемы, вы добьетесь удивительного результата: одна секунда компиляции на код, содержащий несколько мегабайт текста.
13 марта 2010 (Обновление: 15 сен 2010)