Какие методы можно использовать для ускорения времени компиляции C ++? - PullRequest
224 голосов
/ 17 декабря 2008

Какие методы могут быть использованы для ускорения времени компиляции C ++?

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

Я видел связанный вопрос, Почему компиляция C ++ занимает так много времени? , но это не дает много решений.


Проголосуйте, здесь есть поддержка Visual Studio для совместного использования предварительно скомпилированных заголовков между проектами

Ответы [ 24 ]

6 голосов
/ 17 декабря 2008

Вы можете использовать Unity Builds .

1005 *

6 голосов
/ 17 декабря 2008

Используйте предварительные декларации, где вы можете. Если объявление класса использует только указатель или ссылку на тип, вы можете просто объявить его и включить заголовок для типа в файл реализации.

Например:

// T.h
class Class2; // Forward declaration

class T {
public:
    void doSomething(Class2 &c2);
private:
    Class2 *m_Class2Ptr;
};

// T.cpp
#include "Class2.h"
void Class2::doSomething(Class2 &c2) {
    // Whatever you want here
}

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

5 голосов
/ 17 декабря 2008

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

Чтение Рекурсивное создание считается вредным (PDF) для обсуждения этой темы в средах Unix.

5 голосов
/ 17 декабря 2008

Используйте

#pragma once

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

4 голосов
/ 17 декабря 2008
  • Обновите компьютер

    1. Получение четырехъядерного ядра (или системы с двойным квадроциклом)
    2. Получите много оперативной памяти.
    3. Используйте ОЗУ для значительного сокращения задержек файлового ввода-вывода. (Есть компании, которые делают диски IDE и SATA RAM, которые действуют как жесткие диски).
  • Тогда у вас есть все ваши другие типичные предложения

    1. Используйте предварительно скомпилированные заголовки, если они доступны.
    2. Уменьшите количество связей между частями вашего проекта. Изменение одного заголовочного файла обычно не требует перекомпиляции всего вашего проекта.
4 голосов
/ 17 декабря 2008

У меня была идея о с использованием ОЗУ . Оказалось, что для моих проектов это не так уж важно. Но тогда они еще довольно маленькие. Попытайся! Мне было бы интересно услышать, насколько это помогло.

3 голосов
/ 17 декабря 2008

Где ты проводишь время? Вы связаны с процессором? Память связана? Диск связан? Можете ли вы использовать больше ядер? Больше оперативной памяти? Вам нужен RAID? Вы просто хотите повысить эффективность вашей нынешней системы?

.

В gcc / g ++ вы смотрели ccache ? Это может быть полезно, если вы делаете make_clean _; _ делаете много.

3 голосов
/ 17 декабря 2008

Динамическое связывание (.so) может быть намного быстрее, чем статическое связывание (.a). Особенно, когда у вас медленный сетевой диск. Это потому, что у вас есть весь код в .a файле, который нужно обработать и выписать. Кроме того, гораздо больший исполняемый файл должен быть записан на диск.

3 голосов
/ 11 февраля 2015

Не о времени компиляции, а о времени сборки:

  • Используйте ccache , если вам приходится перестраивать те же файлы во время работы в ваших сборочных файлах

  • Используйте ninja-build вместо make. Я сейчас собираю проект с ~ 100 исходными файлами и все кэшируется ccache. создавать потребности 5 минут, ниндзя меньше 1.

Вы можете создавать свои файлы ниндзя из cmake с помощью -GNinja.

2 голосов
/ 29 апреля 2014

Сетевые ресурсы сильно замедляют вашу сборку, так как задержка поиска высока. Для чего-то вроде Boost, это имело огромное значение для меня, хотя наш сетевой диск довольно быстрый. Время на компиляцию игрушечной программы Boost сократилось с 1 минуты до 1 секунды, когда я переключился с общего сетевого ресурса на локальный SSD.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...