Pull to refresh

Comments 29

Мы сократили время компиляции с ~319 мс до ~69 мс

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

Ну, справедливости ради, это очень хорошее сокращение.
Я вот как-то комп себе девелоперский обновил, на 90% из-за того что на старом, один long term проект полностью компилился полторы-две минуты. Задолбался я каждые 10-15 минут ждать по минуте. Для разработки хватало, а время компиляции раздражало жутко. Так что ускорение компиляции примерно в пять раз - вполне себе достойная цель.

UFO just landed and posted this here

Раз в пару месяцев компилю. :)
На старой машинке - одиннадцать часов. На новой - три.

На старой машинке - одиннадцать часов. На новой - три.

Я что-то припоминаю у меня ядро какого-то Линукса компилировалось кроскомпиляцией в 2006 году, ну примерно может минут десять-полчаса, в общем кажется не больше часа.

Что ж вы за зверей разводите? Они на библиотеки ни как не делятся? Может построили не правильно?

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

Я про компиляцию хрома. :)
Ему числомолотилка особо мощная не нужна. Ему потоков побольше. На четырех ядрах (i5) ~ 10-11 часов. На 16 (i7 средний) ~ 3 часа, но еще от опций зависит, конечно.

Ловите гентушника!

А что сразу гентушник! Привыкли чуть что, гентууууушник... :)
Виндузятник на 80%. Просто специфические вещи приходится делать. Например, по дефолту, хромиум компилится без поддержки проприетарных кодеков. А мне надо! Или биндинги наружу выставить специфические. Начинал как все, с CefSharp. Ну а потом покатился по наклонной. И вот меня уже застают за компиляцией хрома. Первые разы было стыдно. Позорище. Горе в семье.
Потом родные привыкли, только шушукаются за спиной. И ребенка больше не спрашивают в школе, чем папа занимается.

А я поддержу гентушника). Разработчики Хрома постоянно какую-то фигню делают - прячут http\https из адреса, увеличивают размеры UI контролов, или впихивают ненужные мне элементы. Вот и приходится исправлять и пересобирать.

Но у меня как-то шустрее собирается: На i5-12600 (macos) — 2,5 часа, на i7-13700 (win11) — чуть больше часа. Оба на SSD.

В C++ это надо умножать на количество юнитов компиляции где этот заголовок используется. Большие проекты состоят из десятков тысяч юнитов, а учитывая что fmt используется в основном в связке с логированием то достаточно большая часть будет его инклюдить.

в С++20 уже можно использовать import std которое должно эти проблемы решить

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

(и import std это C++23 кстати)

В этом случае нет, шаблоны нужно будет создавать в любом случае и это уже оптимизировано (не знаю насколько хорошо)

(и import std это C++23 кстати)

все реализации сделали это расширением в С++20

Както замерял время компиляции в своих проектах. И оно большое не из-за шаблонов. Скорее всего, оно большое просто из-за количества кода в хидерах - их ведь надо загрузить, подставить, раскрыть макросы, спарсить...

Очень интересно все это выглядит. Я когда пришел на проект занялся как раз оптимизацией времени сборки и расхода ресурсов: за 4 месяца работы удалось снизить время сборки с 11 до 8 минут, расход рам с 211 до 170 и по процу почти 15% (сугубо по стресс тесту - сервер мморпг )

спасибо за статью

за 4 месяца работы

расход рам с 211 до 170

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

У меня маленькие любительские проектики, "stdio.h" хватает за глаза, но иногда не уследишь за форматированием. Существуют ли какие-то утилиты, которые можно натравливать на исходники в Pre-Build Event ? Этакий статистический анализатор, заточенный на (v)printf и scanf ?

<spoiler title="Осторожно, боль ))">

Мой первый справочник по С, табличка строки форматирования... Сколько было радости (после Фортрана) от этой тоненькой книжки, 96 страниц чуть шире формата A6. Когда в начале 90-х в руки попал толстый кирпич Страутсрупа с вырвиглазными << и >> я понял, что не смогу привыкнуть к потоковуму вводу-выводу. Один << endl вместо "\n" чего стоит.</spoiler>

>> Этакий статистический анализатор

Извиняюсь, речь конечно же про статический анализатор. И ещё непонятно почему у меня не спрятался спойлер.

Существуют ли какие-то утилиты, которые можно натравливать на исходники в Pre-Build Event? 

В компиляторе gcc есть атрибут `format`, с помощью которого можно заставить компилятор проверять аргументы функции:

int Printf (const char *format, ...)
__attribute__ ((format (printf, 1, 2)));

См. https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html

Для MSVS есть `_Printf_format_string_`, см. https://stackoverflow.com/a/6849629/12479250

Для clang наверняка тоже можно найти нечто подобное.

Спасибо, обязательно попробую. Много изменять не придется, у меня уже стоит wrapper для dbg_Printf и подобного.

Экономия по факту бессмысленная. В подавляющем большинстве пользовательских программ наверняка уже <string> включается почти уж везде, а уж тем более, где нужна эта библиотека fmt.

Спасибо за интересную статью!
Простите за оффтоп, но есть небольшой вопрос. Библиотека {fmt}, про которую идет речь, пример классной полезной библиотеки. Однако я, как программист С++ с 10+летним опытом, про нее ничего не знал до этой статьи. В моем случае это объяснятся двумя факторами: а) я пишу на Qt, в котором есть почти все, что можно захотеть, б) задачи, которые я решаю, специфичные, нешаблонные, неповторяемые по большей части. Так вот вопрос такой:
Есть ли какие-то более-менее централизованные базы/опиcания/списки/дайджесты библиотек на С++? В мире python, как кажется со стороны, в этом плане все неплохо.
Если более конкретно, то прямо сейчас меня интересуют:
1) библиотеки для создания видео (здесь Qt подкачал, к сожалению) - порождение кадров и склейка их со сжатием и наложением звука. Пока знаю только про ffmeg.
2) неcтандартные виджеты на Qt. Изредка обращаюсь на эту тему к github`у, но никогда оттуда ничего интересного на эту тему не видел. Под нестандартными имею в виду что-то типа такого.
Заранее спасибо.

Есть ли какие-то более-менее централизованные базы/опиcания/списки/дайджесты библиотек на С++?

https://github.com/fffaraz/awesome-cpp

1) библиотеки для создания видео (здесь Qt подкачал, к сожалению) - порождение кадров и склейка их со сжатием и наложением звука. Пока знаю только про ffmeg.

вот здесь:

https://habr.com/ru/articles/738350/

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

Важная вещь, спасибо автору оригинала и за перевод.

Одно время тоже решал проблему скорости компиляции fmt, но не слишком долго и упорно. У меня была какая-то идея (помню смутно) что в отладочной версии использовать форматирование типа printf() которое не проверяет типо-безопасность но ускоряет компиляцию пока работаешь. Когда собираешь релиз (или на CI) - уже можно выполнить полную проверку, когда на этапе компиляции детектируются проблемы с несоответствием фактических типов указанным в строке форматирования.

а почему бы не добавить fmt и string в precompiled headers?

Sign up to leave a comment.