SlideShare a Scribd company logo
УСКОРЯЕМ СБОРКУ C++ ПРОЕКТОВ.
ПРАКТИКА ИСПОЛЬЗОВАНИЯ UNITY-СБОРОК
ЛАПИЦКИЙ АРТЁМ
LAPITSKY.ARTEM@GMAIL.COM
1
Почему C++ проекты собираются так долго?
Какие есть способы ускорения сборки C++ кода
Что такое Unity сборки и как они работают
Практика использования Unity сборок
COREHARD // НАЧАЛО / СОДЕРЖАНИЕ
LAPITSKY ARTEM // COREHARD // 2017.10.14
О ЧЁМ БУДЕМ ГОВОРИТЬ
ПОЧЕМУ C++ ПРОЕКТЫ
СОБИРАЮТСЯ ТАК ДОЛГО?
3
Bjarne Stroustrup “The C++ Programming Language. Special
Edition”, 2017
COREHARD // ПОЧЕМУ C++ ПРОЕКТЫ СОБИРАЮТСЯ ТАК ДОЛГО?
LAPITSKY ARTEM // COREHARD // 2017.10.14
ЧЕМ ЗАНИМАЕТСЯ КОМПИЛЯТОР ПРИ СБОРКЕ КОДА
#include <iostream>
int main()
{
std::cout << "Hello, World!n";
}
hello.cpp
4
Результат препроцессинга G++
COREHARD // ПОЧЕМУ C++ ПРОЕКТЫ СОБИРАЮТСЯ ТАК ДОЛГО?
LAPITSKY ARTEM // COREHARD // 2017.10.14
ЧЕМ ЗАНИМАЕТСЯ КОМПИЛЯТОР ПРИ СБОРКЕ КОДА (2)
$ gcc hello.cpp -E > hello.gcc.preprocessed.cpp
$ stat -x hello.gcc.preprocessed.cpp
File: "hello.gcc.preprocessed.cpp"
Size: 1233499 FileType: Regular File
$ cloc hello.gcc.preprocessed.cpp
1 text file.
1 unique file.
0 files ignored.
github.com/AlDanial/cloc v 1.74 T=0.25 s (4.0 files/s, 152999.5 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C++ 1 6824 0 30995
-------------------------------------------------------------------------------
5
Результат препроцессинга MSVC++
COREHARD // ПОЧЕМУ C++ ПРОЕКТЫ СОБИРАЮТСЯ ТАК ДОЛГО?
LAPITSKY ARTEM // COREHARD // 2017.10.14
ЧЕМ ЗАНИМАЕТСЯ КОМПИЛЯТОР ПРИ СБОРКЕ КОДА (3)
> cl /E hello.cpp > hello.vc.preprocessed.cpp
> cloc hello.vc.preprocessed.cpp
1 text file.
1 unique file.
0 files ignored.
github.com/AlDanial/cloc v 1.74 T=0.26 s (3.8 files/s, 192740.0 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C++ 1 23331 0 27286
-------------------------------------------------------------------------------
6
COREHARD // ПОЧЕМУ C++ ПРОЕКТЫ СОБИРАЮТСЯ ТАК ДОЛГО?
LAPITSKY ARTEM // COREHARD // 2017.10.14
C++ И МОДУЛИ
7
Каждый этап трансляции полностью зависит от результата
предыдущих
Трансляция unit’а не может быть распараллелена
Требуется минимум 3 прохода по исходному коду
COREHARD // ПОЧЕМУ C++ ПРОЕКТЫ СОБИРАЮТСЯ ТАК ДОЛГО?
LAPITSKY ARTEM // COREHARD // 2017.10.14
ОСОБЕННОСТИ ПРОЦЕССА ТРАНСЛЯЦИИ C++ КОДА
8
#include делает текстовую подстановку содержимого
заголовочного файла
Смысл подставленного текста полностью зависит от всего, что
было в исходном файле до этого
COREHARD // ПОЧЕМУ C++ ПРОЕКТЫ СОБИРАЮТСЯ ТАК ДОЛГО?
LAPITSKY ARTEM // COREHARD // 2017.10.14
МОДУЛЬНОСТЬ ЧЕРЕЗ ЗАГОЛОВОЧНЫЕ ФАЙЛЫ
#include <foo.h>
...
#define true (bool(__LINE__ % 2))
#include <foo.h>
9
Невозможно использовать повторно результат обработки
заголовочного файла (даже в рамках одного translation unit)
Лишние #include директивы создают массу бессмысленной
работы для компилятора
COREHARD // ПОЧЕМУ C++ ПРОЕКТЫ СОБИРАЮТСЯ ТАК ДОЛГО?
LAPITSKY ARTEM // COREHARD // 2017.10.14
МОДУЛЬНОСТЬ ЧЕРЕЗ ЗАГОЛОВОЧНЫЕ ФАЙЛЫ (2)
10
Выполнение метапрограмм может занимать значительную
часть времени трансляции
Инстанцирование шаблонов происходит в каждом translation
unit отдельно (используйте extern template)
COREHARD // ПОЧЕМУ C++ ПРОЕКТЫ СОБИРАЮТСЯ ТАК ДОЛГО?
LAPITSKY ARTEM // COREHARD // 2017.10.14
TEMPLATE METAPROGRAMMING
СПОСОБЫ УСКОРЕНИЯ СБОРКИ
12
Специальный тип заголовочного файла
Исключена зависимость от контекста включения
Повторное включение заголовочных файлов, включённых в PCH
не должно влиять на смысл программы
Требуется одинаковый набор параметров компилятора для всех
единиц трансляции, которые используют PCH
Их можно компилировать!
COREHARD // СПОСОБЫ УСКОРЕНИЯ СБОРКИ
LAPITSKY ARTEM // COREHARD // 2017.10.14
PRECOMPILED HEADERS (PCH)
13
COREHARD // СПОСОБЫ УСКОРЕНИЯ СБОРКИ
LAPITSKY ARTEM // COREHARD // 2017.10.14
PRECOMPILED HEADERS (PCH)
cpp2
cpp1
header1 header2 headern
…
TU1
TU2
14
COREHARD // СПОСОБЫ УСКОРЕНИЯ СБОРКИ
LAPITSKY ARTEM // COREHARD // 2017.10.14
PRECOMPILED HEADERS (PCH)
cpp2
cpp1
header1 header2 headern
…
TU1
TU2
PCH
15
Ограничения и особенности
Каждый translation unit может использовать ровно один PСH
Нужно быть внимательным к различиям директив препроцессора
разных translation unit
Требует внесения изменений в структуру и параметры сборки
проекта
Нюансы реализации в разных компиляторах
COREHARD // СПОСОБЫ УСКОРЕНИЯ СБОРКИ
LAPITSKY ARTEM // COREHARD // 2017.10.14
PRECOMPILED HEADERS (PСH)
16
COREHARD // СПОСОБЫ УСКОРЕНИЯ СБОРКИ
LAPITSKY ARTEM // COREHARD // 2017.10.14
КЭШИРОВАНИЕ ОБЪЕКТНЫХ ФАЙЛОВ
source code
flags and options
compiler digest
output
compiler
object file
cache
caching service
compiler
17
Для каждого набора входных данных компилятора
сохраняется результат его работы
Схема очень эффективна, когда большая часть
транслируемого кода не меняется
Вторая и последующие сборки до 10-ти раз быстрее первой
COREHARD // СПОСОБЫ УСКОРЕНИЯ СБОРКИ
LAPITSKY ARTEM // COREHARD // 2017.10.14
КЭШИРОВАНИЕ ОБЪЕКТНЫХ ФАЙЛОВ (2)
18
Особенности и ограничения:
Первоначальная сборка всегда дольше сборки без кэширования
Необходимость повторной сборки при изменении даже
незначительных параметров компиляции
Иногда кэшируются «битые» объектные файлы
Плохо работает с механизмом PCH
COREHARD // СПОСОБЫ УСКОРЕНИЯ СБОРКИ
LAPITSKY ARTEM // COREHARD // 2017.10.14
КЭШИРОВАНИЕ ОБЪЕКТНЫХ ФАЙЛОВ (3)
19
COREHARD // СПОСОБЫ УСКОРЕНИЯ СБОРКИ
LAPITSKY ARTEM // COREHARD // 2017.10.14
РАСПРЕДЕЛЁННАЯ СБОРКА
CoordinatorWorkstation
Agent1
build
compile
a1.cpp…an.cpp Agent2
Agent3
compile
c1.cpp…cn.cpp
compile
b1.cpp…bn.cpp
compile
d1.cpp…dn.cpp
20
Особенности и ограничения:
Эффективность сильно зависит от конкретной реализации и
конфигурации сети
Некорректная работа какого-либо из агентов не позволяет успешно
собрать проект
Отладка проблем сборки становится сложнее
COREHARD // СПОСОБЫ УСКОРЕНИЯ СБОРКИ
LAPITSKY ARTEM // COREHARD // 2017.10.14
РАСПРЕДЕЛЁННАЯ СБОРКА (2)
UNITY BUILD
22
Идея: максимально уменьшить количество компилируемых
исходных файлов
COREHARD // UNITY BUILD
LAPITSKY ARTEM // COREHARD // 2017.10.14
UNITY BUILD
23
Объединим все исходные .cpp файлы в один: Unity pack
Исключён повторный разбор и анализ одних и тех же
заголовочных файлов
Не инстанцируются по многу раз одни и те же шаблоны
Сильно упрощается процесс линковки
COREHARD // UNITY BUILD
LAPITSKY ARTEM // COREHARD // 2017.10.14
UNITY BUILD (2)
The Dalai Lama walks into a pizza shop and says
"can you make me one with everything?"
24
COREHARD // UNITY BUILD
LAPITSKY ARTEM // COREHARD // 2017.10.14
UNITY BUILD (3)
45
42
10
7
12
6
0
10
20
30
40
50
60
Visual Studio 2017 Xcode 8.3
Время сборки одного проекта, мин.
Nothing Unity Build IncrediBuild Unity Build + IncrediBuild
25
COREHARD // UNITY BUILD
LAPITSKY ARTEM // COREHARD // 2017.10.14
UNITY BUILD: BEFORE
src1.cpphdr1.h
Headers
hdr2.h hdr3.h
Sources
src2.cpp src3.cpp
Your project
26
COREHARD // UNITY BUILD
LAPITSKY ARTEM // COREHARD // 2017.10.14
UNITY BUILD: AFTER
src1.cpphdr1.h
Headers
hdr2.h hdr3.h
Sources
src2.cpp src3.cpp
Your project unity project
unity_pack.cpp
#include "src1.cpp"
#include "src2.cpp"
#include "src3.cpp"
unity_pack.cpp
27
Использование только одного Unity Pack’а неэффективно
Современные CPU имеют более одного ядра и несколько Unity
pack’ов могут собираться параллельно
Слишком большой Unity pack может вызвать ошибку “out of
memory” или привести к неэффективности процесса компиляции
Множество исходных файлов следует рассредоточить по
нескольким Unity pack’ам
COREHARD // UNITY BUILD
LAPITSKY ARTEM // COREHARD // 2017.10.14
UNITY BUILD: USE EFFECTIVELY
28
Генерацию Unity pack’ов стоит автоматизировать
Рабочее решение на CMake
https://github.com/dava/dava.engine/blob/development/Sources/
CMake/Modules/UnityBuild.cmake
Reducing Compilation Time: Unity Builds © Christoph Heindl
https://cheind.wordpress.com/2009/12/10/reducing-compilation-
time-unity-builds/
COREHARD // UNITY BUILD
LAPITSKY ARTEM // COREHARD // 2017.10.14
UNITY BUILD: AUTOMATE IT!
29
COREHARD // UNITY BUILD
LAPITSKY ARTEM // COREHARD // 2017.10.14
UNITY BUILD: AUTOMATE IT! (2)
Пример проекта на CMake
...
set (HEADER_FILES hdr1.h hdr2.h hdr3.h)
set (SOURCE_FILES src1.cpp src2.cpp src3.cpp)
if (UNITY_BUILD)
# generate unity pack files and add them to ${SOURCE_FILES}
generate_unity_packs(MyProject SOURCE_FILES)
endif()
add_executable(MyProject ${HEADER_FILES} ${SOURCE_FILES})
CMakeLists.txt
ПРАКТИКА ИСПОЛЬЗОВАНИЯ
UNITY-СБОРОК
31
Необходимы модификации исходного кода
Не использовать глобальные static переменные
Не использовать анонимные namespace
Ограничить использование директивы using namespace
Для всех #define необходимы соответствующие #undef
COREHARD // ПРАКТИКА ИСПОЛЬЗОВАНИЯ UNITY-СБОРОК
LAPITSKY ARTEM // COREHARD // 2017.10.14
АДАПТАЦИЯ ПРОЕКТА К UNITY-СБОРКЕ
32
COREHARD // ПРАКТИКА ИСПОЛЬЗОВАНИЯ UNITY-СБОРОК
LAPITSKY ARTEM // COREHARD // 2017.10.14
STATIC И АНОНИМНЫЕ NAMESPACE
...
static int my_local_var = 0;
namespace {
void my_local_function() {
std::cout << “src1n";
}
}
int src1_process() {
my_local_var = 1;
my_local_function();
}
src1.cpp
...
static int my_local_var = 0;
namespace {
void my_local_function() {
std::cout << “src2n";
}
}
int src2_process() {
my_local_var = 2;
my_local_function();
}
src2.cpp
unity_pack.cpp
33
COREHARD // ПРАКТИКА ИСПОЛЬЗОВАНИЯ UNITY-СБОРОК
LAPITSKY ARTEM // COREHARD // 2017.10.14
STATIC И АНОНИМНЫЕ NAMESPACE (2)
...
namespace Ssrc1 {
int my_local_var = 0;
void my_local_function() {
std::cout << “src1n";
}
}
int src1_process() {
using namespace Ssrc1;
my_local_var = 1;
my_local_function();
}
src1.cpp
...
namespace Ssrc2 {
int my_local_var = 0;
void my_local_function() {
std::cout << “src2n";
}
}
int src2_process() {
using namespace Ssrc2;
my_local_var = 2;
my_local_function();
}
src2.cpp
unity_pack.cpp
34
COREHARD // ПРАКТИКА ИСПОЛЬЗОВАНИЯ UNITY-СБОРОК
LAPITSKY ARTEM // COREHARD // 2017.10.14
USING NAMESPACE
...
#include <vector>
using namespace std;
int foo() {
vector<int> numbers;
}
int bar() {
vector<string> strings;
}
src.cpp
...
#include <vector>
int foo() {
using namespace std;
vector<int> numbers;
}
int bar() {
using namespace std;
vector<string> strings;
}
src.cpp
35
Некоторые исходные файлы придётся вынести из unity
pack’ов
если используются специфические системные API
если в проекте есть конфликтующие внешние зависимости
Процесс адаптации можно автоматизировать
COREHARD // ПРАКТИКА ИСПОЛЬЗОВАНИЯ UNITY-СБОРОК
LAPITSKY ARTEM // COREHARD // 2017.10.14
АДАПТАЦИЯ ПРОЕКТА К UNITY-СБОРКЕ (2)
36
Благодаря небольшому и предсказуемому времени сборки
кажется хорошей идеей, но
это ведёт к беспорядку с include’ами
не все IDE справляются с разбором и анализом unity pack’ов
изменение в исходном файле (.cpp) — это пересборка одного
unity_pack’а
изменение в заголовочном файле (.h) — это пересборка 1..N
unity_pack’ов
COREHARD // ПРАКТИКА ИСПОЛЬЗОВАНИЯ UNITY-СБОРОК
LAPITSKY ARTEM // COREHARD // 2017.10.14
РАЗРАБОТКА В UNITY-ПРОЕКТЕ
37
Указанные проблемы решаются использованием механизма
избирательного исключения из Unity сборки тех частей
проекта, в которых будет вестись активная разработка
COREHARD // ПРАКТИКА ИСПОЛЬЗОВАНИЯ UNITY-СБОРОК
LAPITSKY ARTEM // COREHARD // 2017.10.14
РАЗРАБОТКА В UNITY-ПРОЕКТЕ. ПОЛУ-UNITY
...
set (PERSONAL_IGNORES "Dir1/" "Dir2/" "Dir3/")
UnityIgnoreList.cmake
38
За
Огромный прирост скорости компиляции и компоновки
Одинаково высокая скорость как первой, так и последующих
сборок
При адаптации кода вырезается copy-paste
COREHARD // ПРАКТИКА ИСПОЛЬЗОВАНИЯ UNITY-СБОРОК
LAPITSKY ARTEM // COREHARD // 2017.10.14
SUMMARY
39
Против
Требует модификации исходного кода
Накладывает ограничение на использование возможностей C++
Требуется большой объём оперативной памяти при сборке
COREHARD // ПРАКТИКА ИСПОЛЬЗОВАНИЯ UNITY-СБОРОК
LAPITSKY ARTEM // COREHARD // 2017.10.14
SUMMARY (2)
СПАСИБО ЗА ВНИМАНИЕ!
ЛАПИЦКИЙ АРТЁМ
Software Developer https://www.facebook.com/WargamingMinsk
ANY QUESTIONS?
lapitsky.artem@gmail.com
wargaming.com
https://www.linkedin.com/company/wargaming-net

More Related Content

Viewers also liked

Mixing C++ & Python II: Pybind11
Mixing C++ & Python II: Pybind11Mixing C++ & Python II: Pybind11
Mixing C++ & Python II: Pybind11
corehard_by
 
Battle: BDD vs notBDD
Battle: BDD vs notBDDBattle: BDD vs notBDD
Battle: BDD vs notBDD
COMAQA.BY
 
C++ in kernel mode
C++ in kernel modeC++ in kernel mode
C++ in kernel mode
corehard_by
 
Benchmark it
Benchmark itBenchmark it
Benchmark it
corehard_by
 
Analysis and interpretation of monitoring data
Analysis and interpretation of monitoring dataAnalysis and interpretation of monitoring data
Analysis and interpretation of monitoring data
corehard_by
 
Actors for fun and profit
Actors for fun and profitActors for fun and profit
Actors for fun and profit
corehard_by
 
(Не)чёткий поиск
(Не)чёткий поиск(Не)чёткий поиск
(Не)чёткий поиск
corehard_by
 
C++ в играх, больших и не очень
C++ в играх, больших и не оченьC++ в играх, больших и не очень
C++ в играх, больших и не очень
corehard_by
 
MxxRu::externals: Repositoryless Dependency Manager
MxxRu::externals: Repositoryless Dependency ManagerMxxRu::externals: Repositoryless Dependency Manager
MxxRu::externals: Repositoryless Dependency Manager
corehard_by
 
Субъекторная модель
Субъекторная модельСубъекторная модель
Субъекторная модель
corehard_by
 
Restinio - header-only http and websocket server
Restinio - header-only http and websocket serverRestinio - header-only http and websocket server
Restinio - header-only http and websocket server
corehard_by
 
Обработка потока данных на примере deep packet inspection: внутренняя архитек...
Обработка потока данных на примере deep packet inspection: внутренняя архитек...Обработка потока данных на примере deep packet inspection: внутренняя архитек...
Обработка потока данных на примере deep packet inspection: внутренняя архитек...
corehard_by
 
Abseil - let the savior come?
Abseil - let the savior come?Abseil - let the savior come?
Abseil - let the savior come?
corehard_by
 
C++ and Assembly: Debugging and Reverse Engineering
C++ and Assembly: Debugging and Reverse EngineeringC++ and Assembly: Debugging and Reverse Engineering
C++ and Assembly: Debugging and Reverse Engineering
corehard_by
 
The beast is becoming functional
The beast is becoming functionalThe beast is becoming functional
The beast is becoming functional
corehard_by
 
C++Now Trip Report
C++Now Trip ReportC++Now Trip Report
C++Now Trip Report
corehard_by
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
corehard_by
 
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Ontico
 
Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?
COMAQA.BY
 
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
Ontico
 

Viewers also liked (20)

Mixing C++ & Python II: Pybind11
Mixing C++ & Python II: Pybind11Mixing C++ & Python II: Pybind11
Mixing C++ & Python II: Pybind11
 
Battle: BDD vs notBDD
Battle: BDD vs notBDDBattle: BDD vs notBDD
Battle: BDD vs notBDD
 
C++ in kernel mode
C++ in kernel modeC++ in kernel mode
C++ in kernel mode
 
Benchmark it
Benchmark itBenchmark it
Benchmark it
 
Analysis and interpretation of monitoring data
Analysis and interpretation of monitoring dataAnalysis and interpretation of monitoring data
Analysis and interpretation of monitoring data
 
Actors for fun and profit
Actors for fun and profitActors for fun and profit
Actors for fun and profit
 
(Не)чёткий поиск
(Не)чёткий поиск(Не)чёткий поиск
(Не)чёткий поиск
 
C++ в играх, больших и не очень
C++ в играх, больших и не оченьC++ в играх, больших и не очень
C++ в играх, больших и не очень
 
MxxRu::externals: Repositoryless Dependency Manager
MxxRu::externals: Repositoryless Dependency ManagerMxxRu::externals: Repositoryless Dependency Manager
MxxRu::externals: Repositoryless Dependency Manager
 
Субъекторная модель
Субъекторная модельСубъекторная модель
Субъекторная модель
 
Restinio - header-only http and websocket server
Restinio - header-only http and websocket serverRestinio - header-only http and websocket server
Restinio - header-only http and websocket server
 
Обработка потока данных на примере deep packet inspection: внутренняя архитек...
Обработка потока данных на примере deep packet inspection: внутренняя архитек...Обработка потока данных на примере deep packet inspection: внутренняя архитек...
Обработка потока данных на примере deep packet inspection: внутренняя архитек...
 
Abseil - let the savior come?
Abseil - let the savior come?Abseil - let the savior come?
Abseil - let the savior come?
 
C++ and Assembly: Debugging and Reverse Engineering
C++ and Assembly: Debugging and Reverse EngineeringC++ and Assembly: Debugging and Reverse Engineering
C++ and Assembly: Debugging and Reverse Engineering
 
The beast is becoming functional
The beast is becoming functionalThe beast is becoming functional
The beast is becoming functional
 
C++Now Trip Report
C++Now Trip ReportC++Now Trip Report
C++Now Trip Report
 
Поиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кодаПоиск уязвимостей с использованием статического анализа кода
Поиск уязвимостей с использованием статического анализа кода
 
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...
 
Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?Слои тестового фрамеворка. Что? Где? Когда?
Слои тестового фрамеворка. Что? Где? Когда?
 
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)
 

Similar to Ускоряем сборку С++ проектов. Практика использования unity-сборок

Mixing c++ and python
Mixing c++ and pythonMixing c++ and python
Mixing c++ and python
corehard_by
 
Hunting for a C++ package manager
Hunting for a C++ package managerHunting for a C++ package manager
Hunting for a C++ package manager
corehard_by
 
Net core and linux in production
Net core and linux in productionNet core and linux in production
Net core and linux in production
Anatoly Popov
 
Soft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровняSoft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровня
LuxoftTraining
 
Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ci
Александр Сигачев
 
DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...
DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...
DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...
Alex V. Petrov
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest
 
[Add 4] crossplatform .net
[Add 4] crossplatform .net[Add 4] crossplatform .net
[Add 4] crossplatform .net
Stanislav Sidristy
 
NPM и модульная архитектура приложения
NPM и модульная архитектура приложенияNPM и модульная архитектура приложения
NPM и модульная архитектура приложения
Denis Latushkin
 
Kolosov drupalconf2011 2_kolosov
Kolosov drupalconf2011 2_kolosovKolosov drupalconf2011 2_kolosov
Kolosov drupalconf2011 2_kolosov
drupalconf
 
Инструментарий начинающего разработчика Drupal.
Инструментарий начинающего разработчика Drupal.Инструментарий начинающего разработчика Drupal.
Инструментарий начинающего разработчика Drupal.
PVasili
 
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs..."How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
Provectus
 
МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5
Dima Dzuba
 
Linkmeup v076(2019-06).3
Linkmeup v076(2019-06).3Linkmeup v076(2019-06).3
Linkmeup v076(2019-06).3
eucariot
 
CodeFest 2014. Коновалов А., Шкурко Д. — Разработка и оптимизация приложений ...
CodeFest 2014. Коновалов А., Шкурко Д. — Разработка и оптимизация приложений ...CodeFest 2014. Коновалов А., Шкурко Д. — Разработка и оптимизация приложений ...
CodeFest 2014. Коновалов А., Шкурко Д. — Разработка и оптимизация приложений ...
CodeFest
 
"Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно..."Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно...
it-people
 
отладка Mpi приложений
отладка Mpi приложенийотладка Mpi приложений
отладка Mpi приложений
Michael Karpov
 
Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016
Nikita Baksalyar
 
Ігор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developerІгор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developer
LEDC 2016
 

Similar to Ускоряем сборку С++ проектов. Практика использования unity-сборок (20)

Mixing c++ and python
Mixing c++ and pythonMixing c++ and python
Mixing c++ and python
 
Hunting for a C++ package manager
Hunting for a C++ package managerHunting for a C++ package manager
Hunting for a C++ package manager
 
Net core and linux in production
Net core and linux in productionNet core and linux in production
Net core and linux in production
 
Soft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровняSoft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровня
 
Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ci
 
DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...
DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...
DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
 
[Add 4] crossplatform .net
[Add 4] crossplatform .net[Add 4] crossplatform .net
[Add 4] crossplatform .net
 
NPM и модульная архитектура приложения
NPM и модульная архитектура приложенияNPM и модульная архитектура приложения
NPM и модульная архитектура приложения
 
Drupal conf2011 2_kolosov
Drupal conf2011 2_kolosovDrupal conf2011 2_kolosov
Drupal conf2011 2_kolosov
 
Kolosov drupalconf2011 2_kolosov
Kolosov drupalconf2011 2_kolosovKolosov drupalconf2011 2_kolosov
Kolosov drupalconf2011 2_kolosov
 
Инструментарий начинающего разработчика Drupal.
Инструментарий начинающего разработчика Drupal.Инструментарий начинающего разработчика Drupal.
Инструментарий начинающего разработчика Drupal.
 
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs..."How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
"How to build powerful CI / CD based on GitLab and Docker", Aleksandr Matkovs...
 
МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5МАИ, Сети ЭВМ, Лекция №5
МАИ, Сети ЭВМ, Лекция №5
 
Linkmeup v076(2019-06).3
Linkmeup v076(2019-06).3Linkmeup v076(2019-06).3
Linkmeup v076(2019-06).3
 
CodeFest 2014. Коновалов А., Шкурко Д. — Разработка и оптимизация приложений ...
CodeFest 2014. Коновалов А., Шкурко Д. — Разработка и оптимизация приложений ...CodeFest 2014. Коновалов А., Шкурко Д. — Разработка и оптимизация приложений ...
CodeFest 2014. Коновалов А., Шкурко Д. — Разработка и оптимизация приложений ...
 
"Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно..."Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно...
 
отладка Mpi приложений
отладка Mpi приложенийотладка Mpi приложений
отладка Mpi приложений
 
Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016Rust - GDG DevFest Siberia 2016
Rust - GDG DevFest Siberia 2016
 
Ігор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developerІгор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developer
 

More from corehard_by

C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
corehard_by
 
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
corehard_by
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
corehard_by
 
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
corehard_by
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
corehard_by
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
corehard_by
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
corehard_by
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
corehard_by
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
corehard_by
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
corehard_by
 
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
corehard_by
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
corehard_by
 
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
corehard_by
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
corehard_by
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
corehard_by
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
corehard_by
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
corehard_by
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
corehard_by
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
corehard_by
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
corehard_by
 

More from corehard_by (20)

C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
 
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
 
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
 
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
 
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
 

Ускоряем сборку С++ проектов. Практика использования unity-сборок

  • 1. УСКОРЯЕМ СБОРКУ C++ ПРОЕКТОВ. ПРАКТИКА ИСПОЛЬЗОВАНИЯ UNITY-СБОРОК ЛАПИЦКИЙ АРТЁМ LAPITSKY.ARTEM@GMAIL.COM
  • 2. 1 Почему C++ проекты собираются так долго? Какие есть способы ускорения сборки C++ кода Что такое Unity сборки и как они работают Практика использования Unity сборок COREHARD // НАЧАЛО / СОДЕРЖАНИЕ LAPITSKY ARTEM // COREHARD // 2017.10.14 О ЧЁМ БУДЕМ ГОВОРИТЬ
  • 4. 3 Bjarne Stroustrup “The C++ Programming Language. Special Edition”, 2017 COREHARD // ПОЧЕМУ C++ ПРОЕКТЫ СОБИРАЮТСЯ ТАК ДОЛГО? LAPITSKY ARTEM // COREHARD // 2017.10.14 ЧЕМ ЗАНИМАЕТСЯ КОМПИЛЯТОР ПРИ СБОРКЕ КОДА #include <iostream> int main() { std::cout << "Hello, World!n"; } hello.cpp
  • 5. 4 Результат препроцессинга G++ COREHARD // ПОЧЕМУ C++ ПРОЕКТЫ СОБИРАЮТСЯ ТАК ДОЛГО? LAPITSKY ARTEM // COREHARD // 2017.10.14 ЧЕМ ЗАНИМАЕТСЯ КОМПИЛЯТОР ПРИ СБОРКЕ КОДА (2) $ gcc hello.cpp -E > hello.gcc.preprocessed.cpp $ stat -x hello.gcc.preprocessed.cpp File: "hello.gcc.preprocessed.cpp" Size: 1233499 FileType: Regular File $ cloc hello.gcc.preprocessed.cpp 1 text file. 1 unique file. 0 files ignored. github.com/AlDanial/cloc v 1.74 T=0.25 s (4.0 files/s, 152999.5 lines/s) ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- C++ 1 6824 0 30995 -------------------------------------------------------------------------------
  • 6. 5 Результат препроцессинга MSVC++ COREHARD // ПОЧЕМУ C++ ПРОЕКТЫ СОБИРАЮТСЯ ТАК ДОЛГО? LAPITSKY ARTEM // COREHARD // 2017.10.14 ЧЕМ ЗАНИМАЕТСЯ КОМПИЛЯТОР ПРИ СБОРКЕ КОДА (3) > cl /E hello.cpp > hello.vc.preprocessed.cpp > cloc hello.vc.preprocessed.cpp 1 text file. 1 unique file. 0 files ignored. github.com/AlDanial/cloc v 1.74 T=0.26 s (3.8 files/s, 192740.0 lines/s) ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- C++ 1 23331 0 27286 -------------------------------------------------------------------------------
  • 7. 6 COREHARD // ПОЧЕМУ C++ ПРОЕКТЫ СОБИРАЮТСЯ ТАК ДОЛГО? LAPITSKY ARTEM // COREHARD // 2017.10.14 C++ И МОДУЛИ
  • 8. 7 Каждый этап трансляции полностью зависит от результата предыдущих Трансляция unit’а не может быть распараллелена Требуется минимум 3 прохода по исходному коду COREHARD // ПОЧЕМУ C++ ПРОЕКТЫ СОБИРАЮТСЯ ТАК ДОЛГО? LAPITSKY ARTEM // COREHARD // 2017.10.14 ОСОБЕННОСТИ ПРОЦЕССА ТРАНСЛЯЦИИ C++ КОДА
  • 9. 8 #include делает текстовую подстановку содержимого заголовочного файла Смысл подставленного текста полностью зависит от всего, что было в исходном файле до этого COREHARD // ПОЧЕМУ C++ ПРОЕКТЫ СОБИРАЮТСЯ ТАК ДОЛГО? LAPITSKY ARTEM // COREHARD // 2017.10.14 МОДУЛЬНОСТЬ ЧЕРЕЗ ЗАГОЛОВОЧНЫЕ ФАЙЛЫ #include <foo.h> ... #define true (bool(__LINE__ % 2)) #include <foo.h>
  • 10. 9 Невозможно использовать повторно результат обработки заголовочного файла (даже в рамках одного translation unit) Лишние #include директивы создают массу бессмысленной работы для компилятора COREHARD // ПОЧЕМУ C++ ПРОЕКТЫ СОБИРАЮТСЯ ТАК ДОЛГО? LAPITSKY ARTEM // COREHARD // 2017.10.14 МОДУЛЬНОСТЬ ЧЕРЕЗ ЗАГОЛОВОЧНЫЕ ФАЙЛЫ (2)
  • 11. 10 Выполнение метапрограмм может занимать значительную часть времени трансляции Инстанцирование шаблонов происходит в каждом translation unit отдельно (используйте extern template) COREHARD // ПОЧЕМУ C++ ПРОЕКТЫ СОБИРАЮТСЯ ТАК ДОЛГО? LAPITSKY ARTEM // COREHARD // 2017.10.14 TEMPLATE METAPROGRAMMING
  • 13. 12 Специальный тип заголовочного файла Исключена зависимость от контекста включения Повторное включение заголовочных файлов, включённых в PCH не должно влиять на смысл программы Требуется одинаковый набор параметров компилятора для всех единиц трансляции, которые используют PCH Их можно компилировать! COREHARD // СПОСОБЫ УСКОРЕНИЯ СБОРКИ LAPITSKY ARTEM // COREHARD // 2017.10.14 PRECOMPILED HEADERS (PCH)
  • 14. 13 COREHARD // СПОСОБЫ УСКОРЕНИЯ СБОРКИ LAPITSKY ARTEM // COREHARD // 2017.10.14 PRECOMPILED HEADERS (PCH) cpp2 cpp1 header1 header2 headern … TU1 TU2
  • 15. 14 COREHARD // СПОСОБЫ УСКОРЕНИЯ СБОРКИ LAPITSKY ARTEM // COREHARD // 2017.10.14 PRECOMPILED HEADERS (PCH) cpp2 cpp1 header1 header2 headern … TU1 TU2 PCH
  • 16. 15 Ограничения и особенности Каждый translation unit может использовать ровно один PСH Нужно быть внимательным к различиям директив препроцессора разных translation unit Требует внесения изменений в структуру и параметры сборки проекта Нюансы реализации в разных компиляторах COREHARD // СПОСОБЫ УСКОРЕНИЯ СБОРКИ LAPITSKY ARTEM // COREHARD // 2017.10.14 PRECOMPILED HEADERS (PСH)
  • 17. 16 COREHARD // СПОСОБЫ УСКОРЕНИЯ СБОРКИ LAPITSKY ARTEM // COREHARD // 2017.10.14 КЭШИРОВАНИЕ ОБЪЕКТНЫХ ФАЙЛОВ source code flags and options compiler digest output compiler object file cache caching service compiler
  • 18. 17 Для каждого набора входных данных компилятора сохраняется результат его работы Схема очень эффективна, когда большая часть транслируемого кода не меняется Вторая и последующие сборки до 10-ти раз быстрее первой COREHARD // СПОСОБЫ УСКОРЕНИЯ СБОРКИ LAPITSKY ARTEM // COREHARD // 2017.10.14 КЭШИРОВАНИЕ ОБЪЕКТНЫХ ФАЙЛОВ (2)
  • 19. 18 Особенности и ограничения: Первоначальная сборка всегда дольше сборки без кэширования Необходимость повторной сборки при изменении даже незначительных параметров компиляции Иногда кэшируются «битые» объектные файлы Плохо работает с механизмом PCH COREHARD // СПОСОБЫ УСКОРЕНИЯ СБОРКИ LAPITSKY ARTEM // COREHARD // 2017.10.14 КЭШИРОВАНИЕ ОБЪЕКТНЫХ ФАЙЛОВ (3)
  • 20. 19 COREHARD // СПОСОБЫ УСКОРЕНИЯ СБОРКИ LAPITSKY ARTEM // COREHARD // 2017.10.14 РАСПРЕДЕЛЁННАЯ СБОРКА CoordinatorWorkstation Agent1 build compile a1.cpp…an.cpp Agent2 Agent3 compile c1.cpp…cn.cpp compile b1.cpp…bn.cpp compile d1.cpp…dn.cpp
  • 21. 20 Особенности и ограничения: Эффективность сильно зависит от конкретной реализации и конфигурации сети Некорректная работа какого-либо из агентов не позволяет успешно собрать проект Отладка проблем сборки становится сложнее COREHARD // СПОСОБЫ УСКОРЕНИЯ СБОРКИ LAPITSKY ARTEM // COREHARD // 2017.10.14 РАСПРЕДЕЛЁННАЯ СБОРКА (2)
  • 23. 22 Идея: максимально уменьшить количество компилируемых исходных файлов COREHARD // UNITY BUILD LAPITSKY ARTEM // COREHARD // 2017.10.14 UNITY BUILD
  • 24. 23 Объединим все исходные .cpp файлы в один: Unity pack Исключён повторный разбор и анализ одних и тех же заголовочных файлов Не инстанцируются по многу раз одни и те же шаблоны Сильно упрощается процесс линковки COREHARD // UNITY BUILD LAPITSKY ARTEM // COREHARD // 2017.10.14 UNITY BUILD (2) The Dalai Lama walks into a pizza shop and says "can you make me one with everything?"
  • 25. 24 COREHARD // UNITY BUILD LAPITSKY ARTEM // COREHARD // 2017.10.14 UNITY BUILD (3) 45 42 10 7 12 6 0 10 20 30 40 50 60 Visual Studio 2017 Xcode 8.3 Время сборки одного проекта, мин. Nothing Unity Build IncrediBuild Unity Build + IncrediBuild
  • 26. 25 COREHARD // UNITY BUILD LAPITSKY ARTEM // COREHARD // 2017.10.14 UNITY BUILD: BEFORE src1.cpphdr1.h Headers hdr2.h hdr3.h Sources src2.cpp src3.cpp Your project
  • 27. 26 COREHARD // UNITY BUILD LAPITSKY ARTEM // COREHARD // 2017.10.14 UNITY BUILD: AFTER src1.cpphdr1.h Headers hdr2.h hdr3.h Sources src2.cpp src3.cpp Your project unity project unity_pack.cpp #include "src1.cpp" #include "src2.cpp" #include "src3.cpp" unity_pack.cpp
  • 28. 27 Использование только одного Unity Pack’а неэффективно Современные CPU имеют более одного ядра и несколько Unity pack’ов могут собираться параллельно Слишком большой Unity pack может вызвать ошибку “out of memory” или привести к неэффективности процесса компиляции Множество исходных файлов следует рассредоточить по нескольким Unity pack’ам COREHARD // UNITY BUILD LAPITSKY ARTEM // COREHARD // 2017.10.14 UNITY BUILD: USE EFFECTIVELY
  • 29. 28 Генерацию Unity pack’ов стоит автоматизировать Рабочее решение на CMake https://github.com/dava/dava.engine/blob/development/Sources/ CMake/Modules/UnityBuild.cmake Reducing Compilation Time: Unity Builds © Christoph Heindl https://cheind.wordpress.com/2009/12/10/reducing-compilation- time-unity-builds/ COREHARD // UNITY BUILD LAPITSKY ARTEM // COREHARD // 2017.10.14 UNITY BUILD: AUTOMATE IT!
  • 30. 29 COREHARD // UNITY BUILD LAPITSKY ARTEM // COREHARD // 2017.10.14 UNITY BUILD: AUTOMATE IT! (2) Пример проекта на CMake ... set (HEADER_FILES hdr1.h hdr2.h hdr3.h) set (SOURCE_FILES src1.cpp src2.cpp src3.cpp) if (UNITY_BUILD) # generate unity pack files and add them to ${SOURCE_FILES} generate_unity_packs(MyProject SOURCE_FILES) endif() add_executable(MyProject ${HEADER_FILES} ${SOURCE_FILES}) CMakeLists.txt
  • 32. 31 Необходимы модификации исходного кода Не использовать глобальные static переменные Не использовать анонимные namespace Ограничить использование директивы using namespace Для всех #define необходимы соответствующие #undef COREHARD // ПРАКТИКА ИСПОЛЬЗОВАНИЯ UNITY-СБОРОК LAPITSKY ARTEM // COREHARD // 2017.10.14 АДАПТАЦИЯ ПРОЕКТА К UNITY-СБОРКЕ
  • 33. 32 COREHARD // ПРАКТИКА ИСПОЛЬЗОВАНИЯ UNITY-СБОРОК LAPITSKY ARTEM // COREHARD // 2017.10.14 STATIC И АНОНИМНЫЕ NAMESPACE ... static int my_local_var = 0; namespace { void my_local_function() { std::cout << “src1n"; } } int src1_process() { my_local_var = 1; my_local_function(); } src1.cpp ... static int my_local_var = 0; namespace { void my_local_function() { std::cout << “src2n"; } } int src2_process() { my_local_var = 2; my_local_function(); } src2.cpp unity_pack.cpp
  • 34. 33 COREHARD // ПРАКТИКА ИСПОЛЬЗОВАНИЯ UNITY-СБОРОК LAPITSKY ARTEM // COREHARD // 2017.10.14 STATIC И АНОНИМНЫЕ NAMESPACE (2) ... namespace Ssrc1 { int my_local_var = 0; void my_local_function() { std::cout << “src1n"; } } int src1_process() { using namespace Ssrc1; my_local_var = 1; my_local_function(); } src1.cpp ... namespace Ssrc2 { int my_local_var = 0; void my_local_function() { std::cout << “src2n"; } } int src2_process() { using namespace Ssrc2; my_local_var = 2; my_local_function(); } src2.cpp unity_pack.cpp
  • 35. 34 COREHARD // ПРАКТИКА ИСПОЛЬЗОВАНИЯ UNITY-СБОРОК LAPITSKY ARTEM // COREHARD // 2017.10.14 USING NAMESPACE ... #include <vector> using namespace std; int foo() { vector<int> numbers; } int bar() { vector<string> strings; } src.cpp ... #include <vector> int foo() { using namespace std; vector<int> numbers; } int bar() { using namespace std; vector<string> strings; } src.cpp
  • 36. 35 Некоторые исходные файлы придётся вынести из unity pack’ов если используются специфические системные API если в проекте есть конфликтующие внешние зависимости Процесс адаптации можно автоматизировать COREHARD // ПРАКТИКА ИСПОЛЬЗОВАНИЯ UNITY-СБОРОК LAPITSKY ARTEM // COREHARD // 2017.10.14 АДАПТАЦИЯ ПРОЕКТА К UNITY-СБОРКЕ (2)
  • 37. 36 Благодаря небольшому и предсказуемому времени сборки кажется хорошей идеей, но это ведёт к беспорядку с include’ами не все IDE справляются с разбором и анализом unity pack’ов изменение в исходном файле (.cpp) — это пересборка одного unity_pack’а изменение в заголовочном файле (.h) — это пересборка 1..N unity_pack’ов COREHARD // ПРАКТИКА ИСПОЛЬЗОВАНИЯ UNITY-СБОРОК LAPITSKY ARTEM // COREHARD // 2017.10.14 РАЗРАБОТКА В UNITY-ПРОЕКТЕ
  • 38. 37 Указанные проблемы решаются использованием механизма избирательного исключения из Unity сборки тех частей проекта, в которых будет вестись активная разработка COREHARD // ПРАКТИКА ИСПОЛЬЗОВАНИЯ UNITY-СБОРОК LAPITSKY ARTEM // COREHARD // 2017.10.14 РАЗРАБОТКА В UNITY-ПРОЕКТЕ. ПОЛУ-UNITY ... set (PERSONAL_IGNORES "Dir1/" "Dir2/" "Dir3/") UnityIgnoreList.cmake
  • 39. 38 За Огромный прирост скорости компиляции и компоновки Одинаково высокая скорость как первой, так и последующих сборок При адаптации кода вырезается copy-paste COREHARD // ПРАКТИКА ИСПОЛЬЗОВАНИЯ UNITY-СБОРОК LAPITSKY ARTEM // COREHARD // 2017.10.14 SUMMARY
  • 40. 39 Против Требует модификации исходного кода Накладывает ограничение на использование возможностей C++ Требуется большой объём оперативной памяти при сборке COREHARD // ПРАКТИКА ИСПОЛЬЗОВАНИЯ UNITY-СБОРОК LAPITSKY ARTEM // COREHARD // 2017.10.14 SUMMARY (2)
  • 42. ЛАПИЦКИЙ АРТЁМ Software Developer https://www.facebook.com/WargamingMinsk ANY QUESTIONS? lapitsky.artem@gmail.com wargaming.com https://www.linkedin.com/company/wargaming-net