Медленная линковка
От: nen777w  
Дата: 03.03.16 09:10
Оценка:
Добрый час, нужны советы по решению сл. проблемы.
Есть проект статической библиотеки, достаточно большой, но я бы не сказал что уж слишком.
Проблема в том что он продюсит статическую библиотеку размером 1.6 Gb, что конечно же сказывается на линковке с конечным exe размер котрого получается около 100 Mb (это я сейчас говорю о цифрах для debug конфигурации), но тут проблема не в размерах а о во времени которое уходит на линковку.
Это примерно 1 час.

Я понимаю что со статической библиотекой почти ничего сделать нельзя. Инкрементальная линковка включена.
Сделать из нее dll что бы exe линковалась шустрее, не вариант (как мне кажется), библиотека находится в разработке и тогда проблема просто перенесётся на линковку dll.

Что еще можно сделать?
Re: Медленная линковка
От: K13 http://akvis.com
Дата: 03.03.16 09:22
Оценка:
N>Что еще можно сделать?

Дебажная инфа в .obj или в .pdb?
Если в .obj, то сразу переделать.
Re: Медленная линковка
От: niXman Ниоткуда https://github.com/niXman
Дата: 03.03.16 10:38
Оценка:
Здравствуйте, nen777w, Вы писали:

N>Что еще можно сделать?

поделить библиотеку на модули.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[2]: Медленная линковка
От: nen777w  
Дата: 03.03.16 11:28
Оценка:
N>>Что еще можно сделать?
X>поделить библиотеку на модули.

Я думал об этом, но слишком много связей. Если бы tool бы какой то для разгребания этих конюшен... что бы визуально можно было оценить что и куда.
Re: Медленная линковка
От: Mr.Delphist  
Дата: 03.03.16 15:48
Оценка:
Здравствуйте, nen777w, Вы писали:

N>Добрый час, нужны советы по решению сл. проблемы.

N>Есть проект статической библиотеки, достаточно большой, но я бы не сказал что уж слишком.
N>Проблема в том что он продюсит статическую библиотеку размером 1.6 Gb, что конечно же сказывается на линковке с конечным exe размер котрого получается около 100 Mb

Эти 1.6 гига — это что? исполняемый код? данные? дебаг-информация?
Re[2]: Медленная линковка
От: nen777w  
Дата: 03.03.16 20:07
Оценка:
MD>Эти 1.6 гига — это что? исполняемый код? данные? дебаг-информация?
PDB она как и положенно генериться в отдельный файл, который кстати всего ~100 Mb.
Данных там нет, так что получается чистый код.
Смотрел кстати IDA самый жирный obj размером 34Mb там полно фнкций которые попали туда как я понимаю из include хидеров
, хотя сам исходник 16kb и почти ничего не содержит.
Re: Медленная линковка
От: ML380 Земля  
Дата: 03.03.16 20:22
Оценка:
Здравствуйте, nen777w, Вы писали:

N>Добрый час, нужны советы по решению сл. проблемы.

N>Есть проект статической библиотеки, достаточно большой, но я бы не сказал что уж слишком.
N>Проблема в том что он продюсит статическую библиотеку размером 1.6 Gb

На "разбухание кода" проверяли?
Re[2]: Медленная линковка
От: nen777w  
Дата: 03.03.16 20:36
Оценка:
ML>На "разбухание кода" проверяли?

Намекаете на шаблоны. Да их много, но они мелкие по sizeof().
Но 1.9 Gb (ошибся с 1.6 писал по памяти), уж как то очень неприлично.
Re: Медленная линковка
От: Alexander G Украина  
Дата: 03.03.16 21:40
Оценка:
Здравствуйте, nen777w, Вы писали:

N>Что еще можно сделать?


Мне недавно удалось сократить размер библиотеки и время линковки с десяти минут до одной путём избавления от статических переменных в хедерах.

http://rsdn.ru/forum/cpp/6349270.1
Автор: Alexander G
Дата: 15.02.16
Русский военный корабль идёт ко дну!
Re: Медленная линковка
От: Sni4ok  
Дата: 04.03.16 00:09
Оценка:
Здравствуйте, nen777w, Вы писали:

N>Что еще можно сделать?


попробуйте на линуксе собрать, вдруг быстрее будет
Re: Медленная линковка
От: Evgeny.Panasyuk Россия  
Дата: 04.03.16 00:19
Оценка: 5 (2)
Здравствуйте, nen777w, Вы писали:

N>Что еще можно сделать?


Можно попробовать Unity Builds — сгруппировать Translation Units в укрупнённые TU. Могут потребоваться небольшие правки кода, так как местами меняется семантика.
Это:
* ускорит компиляцию — заголовчные файлы обрабатываются меньшее количество раз, воплощения шаблонов переиспользуются.
* уменьшит размер статической библиотеки — одинаковый скомпилированный код не будет дублироваться между мелкими объектными файлами. Сейчас проверил на одном проекте — включение Unity Builds уменьшает размер крупной статический библиотеки в два раза. Я предполагаю (но не тестировал), что это также сократит время линковки в финальный executable.

Создание Unity Builds легко автоматизируется системой сборки — достаточно лисапеда на пару десятков строк. Для CMake есть Cotire, который автоматом делает Unity Builds.
Re[2]: Медленная линковка
От: nen777w  
Дата: 04.03.16 09:23
Оценка:
N>>Что еще можно сделать?

EP>Можно попробовать Unity Builds — сгруппировать Translation Units в укрупнённые TU. Могут потребоваться небольшие правки кода, так как местами меняется семантика.

EP>Это:
EP>* ускорит компиляцию — заголовчные файлы обрабатываются меньшее количество раз, воплощения шаблонов переиспользуются.
EP>* уменьшит размер статической библиотеки — одинаковый скомпилированный код не будет дублироваться между мелкими объектными файлами. Сейчас проверил на одном проекте — включение Unity Builds уменьшает размер крупной статический библиотеки в два раза. Я предполагаю (но не тестировал), что это также сократит время линковки в финальный executable.

EP>Создание Unity Builds легко автоматизируется системой сборки — достаточно лисапеда на пару десятков строк. Для CMake есть Cotire, который автоматом делает Unity Builds.


Спасибо!
Попробовал только что на группе самых жирных obj файлов c сумарным размером в 109Mb.
В результате из начальных 1 952 033 572 либа стала 1 938 606 498 т.е. имеем экономию в 13 427 074 так что что то в этом определённо есть.
Сейчас попробую зайти со стороны cmake.
Интересно на сколько уменьшитья время линковки.
Re[3]: Медленная линковка
От: ML380 Земля  
Дата: 04.03.16 12:45
Оценка: +2
Здравствуйте, nen777w, Вы писали:

N>Намекаете на шаблоны. Да их много, но они мелкие по sizeof().

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

Например, если у вас есть самописный контейнер который использутся со 100 разными типами у вас фактически 100 разных новых классов, которые увеличивают объем бибилиотеки.
Re[4]: Медленная линковка
От: nen777w  
Дата: 04.03.16 15:58
Оценка:
Здравствуйте, ML380, Вы писали:

ML>Здравствуйте, nen777w, Вы писали:


N>>Намекаете на шаблоны. Да их много, но они мелкие по sizeof().

ML>Это никакого отношения к расбуханию не имеет. Надо смотреть в каком количестве они интстансируются с разными параметрами.

ML>Например, если у вас есть самописный контейнер который использутся со 100 разными типами у вас фактически 100 разных новых классов, которые увеличивают объем бибилиотеки.


Так я это и имел в виду. Потяное дело что шаблон сам по себе всего лишь шаблон.
Шаблонов много, но они мелкие все, но это так... на глаз, хотя конечно надо деталнее в цифрах проанализировать.
Re[2]: Медленная линковка
От: nen777w  
Дата: 10.03.16 13:40
Оценка: 28 (2)
EP>Создание Unity Builds легко автоматизируется системой сборки — достаточно лисапеда на пару десятков строк. Для CMake есть Cotire, который автоматом делает Unity Builds.

Рапортую: Либа с 1.9Gb похудела до 1Gb, время линковки с 1 часа до 2 мин 21 сек.
Так что еще раз спасибо за подсказку cotire!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.