C++ - Ускоряет ли сборку #pragma once?

C++, once, pragma

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

Всегда было интересно, действительно ли ускоряется сборка при использовании директивы #pragma once , вместо классического #ifndef #define #endif.

Проверить это ускорение на маленьком проекте довольно проблематично, ведь если проект собирается в среднем за 20 секунд, то и ощутимого ускорения мы скорее всего не увидим, поскольку длительность сборки всегда будет плавать от 17 до 23 секунд.

Но у меня выдалось свободное время и удалось проверить эту теорию на крупном проекте.

Входные данные

Что имеем:

  • Вопрос: Изменится ли скорость сборки проекта при изменении всех #ifndef #define #endif, в заголовочных файлах на #pragma once
  • Чтобы это проверить, нужно заменить дефайны на pragma once в 4874 заголовочных файлах
  • Компилятор MSVC 2017

Чтобы не быть голословным, вот скриншот коммита из Tortoise Git, в котором указаны изменения в 4874 файлах

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

Результат

В итоге я не увидел разницы.

До изменения проект компилировался 15 минут 52 секунды в среднем .

После изменения проект компилировался 15 минут 50 секунд в среднем .

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

Если у вас был обратный опыт, отпишитесь пожалуйста, и скажите, как добились ускорения сборки с #pragma once.




Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
Поддержать автора Donate

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Как стать автором?

Внесите вклад в развитие сообщества EVILEG.

Узнайте, как стать автором сайта.

Изучить
Donate

Добрый день, Дорогие Пользователи !!!

Я Евгений Легоцкой, разработчик EVILEG. И это мой хобби-проект, который помогает учиться программированию другим программистам и разработчикам

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

PayPalYandex.Money
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг Timeweb
g
29 мая 2020 г. 14:32
glushchenkoin

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:40баллов,
  • Очки рейтинга-8
АС
26 мая 2020 г. 11:29
Артём Сун-Дун-Чан

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50баллов,
  • Очки рейтинга-4
МН
25 мая 2020 г. 11:33
Митя Нагибин

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50баллов,
  • Очки рейтинга-4
Последние комментарии
29 мая 2020 г. 13:00
Евгений Легоцкой

Django - Урок 023. Like Dislike система с помощью GenericForeignKey

Думал так, но похоже что нет. {{ post.votes.likes.user.username }} Это же QuerySet будет, а не отдельный единственный объект {% for vote in post.votes %} {{ vote.user.username …
29 мая 2020 г. 11:43
Владислав Меленчук

Django - Урок 023. Like Dislike система с помощью GenericForeignKey

А как получить имя пользователя, который поставил лайк? Думал так, но похоже что нет. {{ post.votes.likes.user.username }}
29 мая 2020 г. 6:30
Евгений Легоцкой

Qt/C++ - Урок 039. Как закрасить строку в QSqlTableModel по значению в столбце

У меня работает. Исправлял в проекте, который приложен к статье. А что происходит в вашем коде, с учётом места вызова этого кода, я знать не могу ;) Дебажьте и добавляйте условия, кото…
МА
29 мая 2020 г. 6:27
Михаил А

Qt/C++ - Урок 039. Как закрасить строку в QSqlTableModel по значению в столбце

QModelIndexList rowIndexes = ui->tableView->selectionModel()->selectedRows(); model->removeRows(rowIndexes.first().row(), rowIndexes.size()); model-&…
Сейчас обсуждают на форуме
РС
30 мая 2020 г. 15:41
Руслан Склюев

Минимальный размер Item

Здравствуйте, новичек в QML. Раньше у меня было несколько окон и минимальный размер считал так: minimumHeight: loGeneral.implicitHeight + 2 loGeneral.anchors.margins minimumWid…
S
РС
30 мая 2020 г. 11:49
Руслан Склюев

QML Как при нажатии на кнопку изменить название окна?

У меня три файла: 1. QML - это Loader и Window 2. QML вход в программу - страница Loader (там есть Switch) 3. QML - MainMenu. Мне нужно в (1), чтобы если на (2) Switch.enable, то …
ДК
29 мая 2020 г. 13:27
Джон Кофи

QMap<> какой ключ лучше

это ясно. Вопрос в том, как быстро мапа будет отрабатывать, если ключом будет QModelIndex. Какой параметр индекса возьмет за ключ. И вот насколько это будет медленнее или быстрее, чем QString пр…
ДК
29 мая 2020 г. 11:10
Джон Кофи

QModelIndex становится не действительным, но валидный

Привет. Есть проблема с индексом и для меня это чистая магия: Сначала, что делаю: на вьюхе есть редактируемые ячейки. Пользователь редактирует одну, потом внезапно решает не сохраниться и ш…
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB