Производительность компилятора: несколько библиотек против одной библиотеки в CMake

Я долго задавался вопросом, когда писал свои файлы C++ CMake, которые быстрее для компилятора:

  1. Помещение всех файлов cpp моего проекта в одну общую библиотеку .so с использованием add_library()
  2. Использование нескольких библиотек, по одной для каждого класса/логического компонента.

Поиск в Интернете не нашел подходящих статей об этом любопытстве, поэтому я решил провести очень простой эксперимент. Я сделал две версии своего проекта - одну с одной библиотекой и одну с двумя библиотеками. Я обнаружил, что при прогонах версия с одной библиотекой была на 25 % быстрее при компиляции с нуля и на 1 % быстрее при компиляции после изменения одной строки в одном из файлов. Правда, мои эксперименты были не очень тщательными.

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

  • Кто-нибудь знает общее правило производительности библиотек CMake?
  • Кто-нибудь может объяснить, почему я вижу эту разницу?

Спасибо!

Обновление: я собираю Ubuntu 14.04 с gcc 4.8.4.


person davetcoleman    schedule 02.05.2016    source источник
comment
Я рекомендую создавать библиотеки на основе темы, а не чудовищную единую библиотеку. Меньшие библиотеки позволят вам легче обмениваться кодом между различными проектами. Если вам нужно более быстрое время компиляции или сборки, приобретите более быстрый компьютер.   -  person Thomas Matthews    schedule 03.05.2016
comment
о какой библиотеке идет речь и о какой платформе? библиотека может быть статической (.a, .lib) или общей (.so, .dll), платформа = OS, compiler, linker   -  person fghj    schedule 03.05.2016
comment
Я провел некоторые измерения производительности, просматривая cmake reboot_cache для just< /i> подкаталог? Хотя это в основном проверяло производительность самого CMake, оно показало, например. что антивирусное программное обеспечение, сканирующее CMake/компилятор/компоновщик каждый раз, когда оно вызывается, оказало большое влияние. Поскольку разделение на несколько библиотек увеличивает количество операций ввода-вывода, это хорошее место, чтобы начать искать узкое место в производительности.   -  person Florian    schedule 03.05.2016