Antony Polukhin
Полухин Антон
Незаменимый C++
Содержание
●
На C++ больше не пишут?
●
C++ vs. Asm
●
C++ vs. Rust
●
C++ vs. Go
●
C++ vs. (Java + C#)
●
Слабые места C++
●
Что с этим делать
Незаменимый C++
Asm
C++20
Заблуждение №1
На C++ больше не пишут программ
Незаменимый C++
Программы
Незаменимый C++ 5 / 131
Программы ●
Поисковые движки
Незаменимый C++ 6 / 131
Программы ●
Поисковые движки
●
Большинство высоконагруженных програм (Такси)
Незаменимый C++ 7 / 131
Программы ●
Поисковые движки
●
Большинство высоконагруженных програм (Такси)
●
Игры
Незаменимый C++ 8 / 131
Программы ●
Поисковые движки
●
Большинство высоконагруженных програм (Такси)
●
Игры
●
Браузеры
Незаменимый C++ 9 / 131
Программы ●
Поисковые движки
●
Большинство высоконагруженных програм (Такси)
●
Игры
●
Браузеры
●
Спецэффекты и анимация
Незаменимый C++ 10 / 131
Программы ●
Поисковые движки
●
Большинство высоконагруженных програм (Такси)
●
Игры
●
Браузеры
●
Спецэффекты и анимация
●
Компиляторы (не только компиляторы для С++)
Незаменимый C++ 11 / 131
Программы ●
Поисковые движки
●
Большинство высоконагруженных програм (Такси)
●
Игры
●
Браузеры
●
Спецэффекты и анимация
●
Компиляторы (не только компиляторы для С++)
●
«Виртуальные машины»
Незаменимый C++ 12 / 131
Программы ●
Поисковые движки
●
Большинство высоконагруженных програм (Такси)
●
Игры
●
Браузеры
●
Спецэффекты и анимация
●
Компиляторы (не только компиляторы для С++)
●
«Виртуальные машины»
●
Научные программы (CERN и Бозон Хиггса)
Незаменимый C++ 13 / 131
Программы ●
Поисковые движки
●
Большинство высоконагруженных програм (Такси)
●
Игры
●
Браузеры
●
Спецэффекты и анимация
●
Компиляторы (не только компиляторы для С++)
●
«Виртуальные машины»
●
Научные программы (CERN и Бозон Хиггса)
●
Части ОС (Драйверы, userspace)
Незаменимый C++ 14 / 131
Программы ●
Поисковые движки
●
Большинство высоконагруженных програм (Такси)
●
Игры
●
Браузеры
●
Спецэффекты и анимация
●
Компиляторы (не только компиляторы для С++)
●
«Виртуальные машины»
●
Научные программы (CERN и Бозон Хиггса)
●
Части ОС (Драйверы, userspace)
●
Автопром
Незаменимый C++ 15 / 131
Программы ●
Поисковые движки
●
Большинство высоконагруженных програм (Такси)
●
Игры
●
Браузеры
●
Спецэффекты и анимация
●
Компиляторы (не только компиляторы для С++)
●
«Виртуальные машины»
●
Научные программы (CERN и Бозон Хиггса)
●
Части ОС (Драйверы, userspace)
●
Автопром
●
Заводы
Незаменимый C++ 16 / 131
Программы ●
Поисковые движки
●
Большинство высоконагруженных програм (Такси)
●
Игры
●
Браузеры
●
Спецэффекты и анимация
●
Компиляторы (не только компиляторы для С++)
●
«Виртуальные машины»
●
Научные программы (CERN и Бозон Хиггса)
●
Части ОС (Драйверы, userspace)
●
Автопром
●
Заводы
●
Биржа
Незаменимый C++ 17 / 131
Программы ●
Поисковые движки
●
Большинство высоконагруженных програм (Такси)
●
Игры
●
Браузеры
●
Спецэффекты и анимация
●
Компиляторы (не только компиляторы для С++)
●
«Виртуальные машины»
●
Научные программы (CERN и Бозон Хиггса)
●
Части ОС (Драйверы, userspace)
●
Автопром
●
Заводы
●
Биржа
●
Офисные приложения
Незаменимый C++ 18 / 131
ОК, чем C++ привлекает
сегодня?
Незаменимый C++
C++
Незаменимый C++ 20 / 131
C++ + zero-overhead
Незаменимый C++ 21 / 131
C++ + zero-overhead
+ неограниченные возможности
Незаменимый C++ 22 / 131
C++ + zero-overhead
+ неограниченные возможности
+ поддержка огромного количества платформ
Незаменимый C++ 23 / 131
C++ + zero-overhead
+ неограниченные возможности
+ поддержка огромного количества платформ
+ безопасность
Незаменимый C++ 24 / 131
C++ + zero-overhead
+ неограниченные возможности
+ поддержка огромного количества платформ
+ безопасность?
Незаменимый C++ 25 / 131
C++ + zero-overhead
+ неограниченные возможности
+ поддержка огромного количества платформ
+ безопасность?
+ небольшой рантайм
Незаменимый C++ 26 / 131
Сравним с другими языками!
Незаменимый C++
С++ vs. Asm
Незаменимый C++
C++ vs. Asm
Незаменимый C++ 29 / 131
C++ vs. Asm + Ассемблер позволяет выжать максимум из
железа
Незаменимый C++ 30 / 131
C++ vs. Asm + Ассемблер позволяет выжать максимум из
железа
- непереносимый код
Незаменимый C++ 31 / 131
C++ vs. Asm + Ассемблер позволяет выжать максимум из
железа
- непереносимый код
- очень медленная разработка
Незаменимый C++ 32 / 131
C++ vs. Asm + Ассемблер позволяет выжать максимум из
железа
- непереносимый код
- очень медленная разработка
- не всегда быстрее
Незаменимый C++ 33 / 131
C++ vs. Asm + Ассемблер позволяет выжать максимум из
железа
- непереносимый код
- очень медленная разработка
- не всегда быстрее
Незаменимый C++ 34 / 131
Заблуждение №2
Большие программы на C++ работают медленнее чем
на ASM
Незаменимый C++
C++ vs. Asm (или как завалить Asm разработчика)
x % 2361 == 7
Незаменимый C++ 36 / 131
C++ vs. Asm (или как завалить Asm разработчика)
Незаменимый C++ 37 / 131
C++ vs. Asm (или как завалить Asm разработчика)
Незаменимый C++ 38 / 131
С++ vs. Rust
Незаменимый C++
C++ vs. Rust
Незаменимый C++ 40 / 131
C++ vs. Rust + Отличная безопасность?
Незаменимый C++ 41 / 131
C++ vs. Rust + Отличная безопасность?
+ Потенциальная возможность оптимизировать
лучше C++
Незаменимый C++ 42 / 131
Заблуждение №3
Rust более/такой же производительный как C++
Незаменимый C++
Анатомия компилятора (упрощённо)
Незаменимый C++
С++С Rust ...
Middle end
Ada Go
IR
IR
Power PCx86 Alpha ...Arm x86_64
44 / 131
C++ vs. Rust
Незаменимый C++ 45 / 131
Где UB ?
Незаменимый C++ 46 / 131
C++ vs. Rust
Незаменимый C++ 47 / 131
C++ vs. Rust
Незаменимый C++ 48 / 131
C++ vs. Rust
Незаменимый C++ 49 / 131
C++ vs. Rust
Незаменимый C++ 50 / 131
C++ vs. Rust Вроде норм.
Незаменимый C++ 51 / 131
C++ vs. Rust Вроде норм.
Переходим на Rust?
Незаменимый C++ 52 / 131
C++ vs. Rust Вроде норм.
Переходим на Rust?
Oh, wait!..
Незаменимый C++ 53 / 131
C++ vs. Rust Вроде норм.
Переходим на Rust?
Oh, wait!..
C C++ — noop→
C Rust — PAIN!!!!!!!→
Незаменимый C++ 54 / 131
C Rust→
●
unsafe {} нет безопасности→
Незаменимый C++ 55 / 131
C Rust→
●
unsafe {} нет безопасности→
●
Нет возможности использовать C headers
●
Надо генерировать свои
– Обновление библиотек — БОЛЬ!
– Надо headers руками допатчивать
– Мучительные страдания с borrow checker на
сложных С проектах
[https://hackernoon.com/why-im-dropping-
rust-fd1c32986c88]
Незаменимый C++ 56 / 131
Заблуждение №4
Программа написанная на языке Rust X не содержит
ошибок
Незаменимый C++
Anything
●
unsafe или аналоги нет безопасности→
Незаменимый C++ 58 / 131
Anything
●
unsafe или аналоги нет безопасности→
●
если ваша программа компилится, это ещё не
значит что всё ОК
Незаменимый C++ 59 / 131
С++ vs. Go
Незаменимый C++
C++ vs. Go
Незаменимый C++ 61 / 131
C++ vs. Go - <великое множество>
Незаменимый C++ 62 / 131
C++ vs. Go - <великое множество>
+ Асинхронность и многопточность на основе
корутин
Незаменимый C++ 63 / 131
C++ vs. Go - <великое множество>
+ Асинхронность и многопточность на основе
корутин
●
Boost.Fibers
Незаменимый C++ 64 / 131
C++ vs. Go - <великое множество>
+ Асинхронность и многопточность на основе
корутин
●
Boost.Fibers
●
Yandex.Taxi userver
Незаменимый C++ 65 / 131
C++ vs. Go - <великое множество>
+ Асинхронность и многопточность на основе
корутин
●
Boost.Fibers
●
Yandex.Taxi userver
●
Quantum
Незаменимый C++ 66 / 131
C++ vs. Go - <великое множество>
+ Асинхронность и многопточность на основе
корутин
●
Boost.Fibers
●
Yandex.Taxi userver
●
Quantum
●
Folly fibers
Незаменимый C++ 67 / 131
C++ vs. Go - <великое множество>
+ Асинхронность и многопточность на основе
корутин
●
Boost.Fibers
●
Yandex.Taxi userver
●
Quantum
●
Folly fibers
●
Coroutines TS
Незаменимый C++ 68 / 131
C++ vs. Go - <великое множество>
+ Асинхронность и многопточность на основе
корутин
●
Boost.Fibers
●
Yandex.Taxi userver
●
Quantum
●
Folly fibers
●
Coroutines TS
●
C++20
Незаменимый C++ 69 / 131
Python vs. Go Go скорее конкурент Python, чем C++
Незаменимый C++ 70 / 131
Заблуждение №5
Бенчмарки показывают что прогарммы на X быстрее
C++
Незаменимый C++
Добро пожаловать в мир
«честных» бенчмарков!
Незаменимый C++
Типичные
ошибки
●
Отключается сборщик мусора
Незаменимый C++ 73 / 131
Типичные
ошибки
●
Отключается сборщик мусора
●
Код написан не на C++
Незаменимый C++ 74 / 131
Типичные
ошибки
●
Отключается сборщик мусора
●
Код на C++ написан в стиле float* f = new float;
Незаменимый C++ 75 / 131
Типичные
ошибки
●
Отключается сборщик мусора
●
Код на C++ написан в стиле float* f = new float;
●
На Х написана другая программа
Незаменимый C++ 76 / 131
Типичные
ошибки
●
Отключается сборщик мусора
●
Код на C++ написан в стиле float* f = new float;
●
На Х написана другая программа
●
Тестируется библиотека а не язык
Незаменимый C++ 77 / 131
Заблуждение №6
Сборщик мусора не добавляет накладных расходов
Незаменимый C++
Mark and sweep
Незаменимый C++ 79 / 131
structures
struct list_node {
list_node* next;
list_node* prev;
};
struct slist_node {
slist_node* next;
};
Незаменимый C++ 80 / 131
structures
vector<void*> root;
Незаменимый C++ 81 / 131
structures
vector<void*> root; // root[0] — это slist_node или list_node?
Незаменимый C++ 82 / 131
structures
vector<void*> root; // Сколько указателей и где они?
vector<Object*> root;
Незаменимый C++ 83 / 131
structures
struct list_node {
__meta vptr;
list_node* next;
list_node* prev;
};
struct slist_node {
__meta vptr;
slist_node* next;
};
Незаменимый C++ 84 / 131
Stop the world ●
Все потоки останавливаются
Незаменимый C++ 85 / 131
Stop the world ●
Все потоки останавливаются
●
Проходим по всем узлам графа, помечая
достижимые узлы
Незаменимый C++ 86 / 131
Stop the world ●
Все потоки останавливаются
●
Проходим по всем узлам графа, помечая
достижимые узлы
●
????
Незаменимый C++ 87 / 131
Stop the world ●
Все потоки останавливаются
●
Проходим по всем узлам графа, помечая
достижимые узлы
●
????
●
Profit
Незаменимый C++ 88 / 131
Stop the world ●
Все потоки останавливаются
●
Проходим по всем узлам графа, помечая
достижимые узлы
●
????
●
Profit
●
На современном железе больше 1 ядра!
Незаменимый C++ 89 / 131
Stop the world ●
Все потоки останавливаются
●
Проходим по всем узлам графа, помечая
достижимые узлы
●
????
●
Profit
●
На современном железе больше 1 ядра!
●
При каждой сборке мусора мы проходимся по
всем узлам постоянно перепроверяя живые→
узлы
Незаменимый C++ 90 / 131
No stop the
world
●
Ничего не останавливается
Незаменимый C++ 91 / 131
No stop the
world
●
Ничего не останавливается
●
Многопоточно разбираем мусор
Незаменимый C++ 92 / 131
No stop the
world
●
Ничего не останавливается
●
Многопоточно разбираем мусор
●
Ура!
Незаменимый C++ 93 / 131
No stop the
world
●
Ничего не останавливается
●
Многопоточно разбираем мусор
●
Ура!
●
НО
Незаменимый C++ 94 / 131
No stop the
world
●
Ничего не останавливается
●
Многопоточно разбираем мусор
●
Ура!
●
НО
●
Нам нужно синхронизировать все потоки через
атомарные инструкции
Незаменимый C++ 95 / 131
No stop the
world
●
Ничего не останавливается
●
Многопоточно разбираем мусор
●
Ура!
●
НО
●
Нам нужно синхронизировать все потоки через
атомарные инструкции
●
Это очень дорого, если не мы последними
трогали ресурс
Незаменимый C++ 96 / 131
No stop the
world
●
Ничего не останавливается
●
Многопоточно разбираем мусор
●
Ура!
●
НО
●
Нам нужно синхронизировать все потоки через
атомарные инструкции
●
Это очень дорого, если не мы последними
трогали ресурс
●
Мы делаем это при каждой сборке мусора!
Незаменимый C++ 97 / 131
+ Не проходим
лишние разы
Незаменимый C++ 98 / 131
structures
struct list_node {
shared_ptr<list_node> next; // atomic refcounter
shared_ptr<list_node> prev; // atomic refcounter
};
struct slist_node {
shared_ptr<slist_node> next; // atomic refcounter
};
Незаменимый C++ 99 / 131
Это ещё не всё!
shared_ptr<Object> some;
Незаменимый C++ 100 / 131
Это ещё не всё!
shared_ptr<Object> some; // Скоро будет больно!
Незаменимый C++ 101 / 131
Это ещё не всё!
shared_ptr<Object> some; // Скоро будет больно!
shared_ptr<Object> prev = some.a; // ...
Незаменимый C++ 102 / 131
Это ещё не всё!
shared_ptr<Object> some; // Скоро будет больно!
shared_ptr<Object> prev = some.a; // ...
prev.a = some; // Циклические ссылки!
Незаменимый C++ 103 / 131
Trade-offs
Незаменимый C++ 104 / 131
Trade-offs ●
Плавающий мусор
Незаменимый C++ 105 / 131
Trade-offs ●
Плавающий мусор
●
… или удар по производительности
Незаменимый C++ 106 / 131
Trade-offs ●
Плавающий мусор
●
… или удар по производительности
●
Останавливать все потоки и тормозить с
непредсказуемыми задержками
Незаменимый C++ 107 / 131
Trade-offs ●
Плавающий мусор
●
… или удар по производительности
●
Останавливать все потоки и тормозить с
непредсказуемыми задержками
●
… или ничего не останавливать и тратить CPU
такты впустую
Незаменимый C++ 108 / 131
Trade-offs ●
Плавающий мусор
●
… или удар по производительности
●
Останавливать все потоки и тормозить с
непредсказуемыми задержками
●
… или ничего не останавливать и тратить CPU
такты впустую
●
Плата за Object*
Незаменимый C++ 109 / 131
С++ vs. (Java + C#)
Незаменимый C++
C# ?? Java
Незаменимый C++ 111 / 131
C# ?? Java ●
См. «Сборщики Мусора»
Незаменимый C++ 112 / 131
Logstash – Программа для сбора, трансформации и
складирования логов.
Бесплатное и очень популярное Open Source
приложение на Java.
Что может пойти не так?
Незаменимый C++ 113 / 131
Logstash – Программа для сбора, трансформации и
складирования логов.
Бесплатное и очень популярное Open Source
приложение на Java.
Что может пойти не так?
Незаменимый C++ 114 / 131
Слабые места C++
Незаменимый C++
C++
Незаменимый C++ 116 / 131
C++ - скрытый высокий порог вхождения
- неограниченные возможности
- проблемы с безопасностью
Незаменимый C++ 117 / 131
C++ - скрытый высокий порог вхождения
- неограниченные возможности
- проблемы с безопасностью
- отсутствие изкоробочности
- крошечная стандартная библиотека
- отсутствие готовой инфраструктуры
Незаменимый C++ 118 / 131
ОК, а что делать то?
Незаменимый C++
Незаменимый C++ 120 / 131
Итоги
Незаменимый C++
Итоги
Незаменимый C++ 122 / 131
Итоги ●
C++ везде
Незаменимый C++ 123 / 131
Итоги ●
C++ везде
●
C++ крайне популярен
Незаменимый C++ 124 / 131
Итоги ●
C++ везде
●
C++ крайне популярен
●
С++ - самый производительный инструмент для
написания больших приложений
Незаменимый C++ 125 / 131
Итоги ●
C++ везде
●
C++ крайне популярен
●
С++ - самый производительный инструмент для
написания больших приложений
●
Относитесь со скепсисом к бенчмаркам
Незаменимый C++ 126 / 131
Итоги ●
C++ везде
●
C++ крайне популярен
●
С++ - самый производительный инструмент для
написания больших приложений
●
Относитесь со скепсисом к бенчмаркам
●
Не верьте managed языкам, которые говорят что
они быстрее C++
Незаменимый C++ 127 / 131
Итоги ●
C++ везде
●
C++ крайне популярен
●
С++ - самый производительный инструмент для
написания больших приложений
●
Относитесь со скепсисом к бенчмаркам
●
Не верьте managed языкам, которые говорят что
они быстрее C++
●
С++ не идеален!..
Незаменимый C++ 128 / 131
Итоги ●
C++ везде
●
C++ крайне популярен
●
С++ - самый производительный инструмент для
написания больших приложений
●
Относитесь со скепсисом к бенчмаркам
●
Не верьте managed языкам, которые говорят что
они быстрее C++
●
С++ не идеален!..
●
...но это исправимо
Незаменимый C++ 129 / 131
Спасибо
Полухин Антон
Старший разработчик Yandex.Taxi
antoshkka@yandex-team.ru
antoshkka@gmail.com
https://github.com/apolukhin
https://stdcpp.ru/

Незаменимый С++. Антон Полухин. CoreHard Spring 2019

  • 2.
  • 3.
    Содержание ● На C++ большене пишут? ● C++ vs. Asm ● C++ vs. Rust ● C++ vs. Go ● C++ vs. (Java + C#) ● Слабые места C++ ● Что с этим делать Незаменимый C++ Asm C++20
  • 4.
    Заблуждение №1 На C++больше не пишут программ Незаменимый C++
  • 5.
  • 6.
  • 7.
    Программы ● Поисковые движки ● Большинствовысоконагруженных програм (Такси) Незаменимый C++ 7 / 131
  • 8.
    Программы ● Поисковые движки ● Большинствовысоконагруженных програм (Такси) ● Игры Незаменимый C++ 8 / 131
  • 9.
    Программы ● Поисковые движки ● Большинствовысоконагруженных програм (Такси) ● Игры ● Браузеры Незаменимый C++ 9 / 131
  • 10.
    Программы ● Поисковые движки ● Большинствовысоконагруженных програм (Такси) ● Игры ● Браузеры ● Спецэффекты и анимация Незаменимый C++ 10 / 131
  • 11.
    Программы ● Поисковые движки ● Большинствовысоконагруженных програм (Такси) ● Игры ● Браузеры ● Спецэффекты и анимация ● Компиляторы (не только компиляторы для С++) Незаменимый C++ 11 / 131
  • 12.
    Программы ● Поисковые движки ● Большинствовысоконагруженных програм (Такси) ● Игры ● Браузеры ● Спецэффекты и анимация ● Компиляторы (не только компиляторы для С++) ● «Виртуальные машины» Незаменимый C++ 12 / 131
  • 13.
    Программы ● Поисковые движки ● Большинствовысоконагруженных програм (Такси) ● Игры ● Браузеры ● Спецэффекты и анимация ● Компиляторы (не только компиляторы для С++) ● «Виртуальные машины» ● Научные программы (CERN и Бозон Хиггса) Незаменимый C++ 13 / 131
  • 14.
    Программы ● Поисковые движки ● Большинствовысоконагруженных програм (Такси) ● Игры ● Браузеры ● Спецэффекты и анимация ● Компиляторы (не только компиляторы для С++) ● «Виртуальные машины» ● Научные программы (CERN и Бозон Хиггса) ● Части ОС (Драйверы, userspace) Незаменимый C++ 14 / 131
  • 15.
    Программы ● Поисковые движки ● Большинствовысоконагруженных програм (Такси) ● Игры ● Браузеры ● Спецэффекты и анимация ● Компиляторы (не только компиляторы для С++) ● «Виртуальные машины» ● Научные программы (CERN и Бозон Хиггса) ● Части ОС (Драйверы, userspace) ● Автопром Незаменимый C++ 15 / 131
  • 16.
    Программы ● Поисковые движки ● Большинствовысоконагруженных програм (Такси) ● Игры ● Браузеры ● Спецэффекты и анимация ● Компиляторы (не только компиляторы для С++) ● «Виртуальные машины» ● Научные программы (CERN и Бозон Хиггса) ● Части ОС (Драйверы, userspace) ● Автопром ● Заводы Незаменимый C++ 16 / 131
  • 17.
    Программы ● Поисковые движки ● Большинствовысоконагруженных програм (Такси) ● Игры ● Браузеры ● Спецэффекты и анимация ● Компиляторы (не только компиляторы для С++) ● «Виртуальные машины» ● Научные программы (CERN и Бозон Хиггса) ● Части ОС (Драйверы, userspace) ● Автопром ● Заводы ● Биржа Незаменимый C++ 17 / 131
  • 18.
    Программы ● Поисковые движки ● Большинствовысоконагруженных програм (Такси) ● Игры ● Браузеры ● Спецэффекты и анимация ● Компиляторы (не только компиляторы для С++) ● «Виртуальные машины» ● Научные программы (CERN и Бозон Хиггса) ● Части ОС (Драйверы, userspace) ● Автопром ● Заводы ● Биржа ● Офисные приложения Незаменимый C++ 18 / 131
  • 19.
    ОК, чем C++привлекает сегодня? Незаменимый C++
  • 20.
  • 21.
  • 22.
    C++ + zero-overhead +неограниченные возможности Незаменимый C++ 22 / 131
  • 23.
    C++ + zero-overhead +неограниченные возможности + поддержка огромного количества платформ Незаменимый C++ 23 / 131
  • 24.
    C++ + zero-overhead +неограниченные возможности + поддержка огромного количества платформ + безопасность Незаменимый C++ 24 / 131
  • 25.
    C++ + zero-overhead +неограниченные возможности + поддержка огромного количества платформ + безопасность? Незаменимый C++ 25 / 131
  • 26.
    C++ + zero-overhead +неограниченные возможности + поддержка огромного количества платформ + безопасность? + небольшой рантайм Незаменимый C++ 26 / 131
  • 27.
    Сравним с другимиязыками! Незаменимый C++
  • 28.
  • 29.
  • 30.
    C++ vs. Asm+ Ассемблер позволяет выжать максимум из железа Незаменимый C++ 30 / 131
  • 31.
    C++ vs. Asm+ Ассемблер позволяет выжать максимум из железа - непереносимый код Незаменимый C++ 31 / 131
  • 32.
    C++ vs. Asm+ Ассемблер позволяет выжать максимум из железа - непереносимый код - очень медленная разработка Незаменимый C++ 32 / 131
  • 33.
    C++ vs. Asm+ Ассемблер позволяет выжать максимум из железа - непереносимый код - очень медленная разработка - не всегда быстрее Незаменимый C++ 33 / 131
  • 34.
    C++ vs. Asm+ Ассемблер позволяет выжать максимум из железа - непереносимый код - очень медленная разработка - не всегда быстрее Незаменимый C++ 34 / 131
  • 35.
    Заблуждение №2 Большие программына C++ работают медленнее чем на ASM Незаменимый C++
  • 36.
    C++ vs. Asm(или как завалить Asm разработчика) x % 2361 == 7 Незаменимый C++ 36 / 131
  • 37.
    C++ vs. Asm(или как завалить Asm разработчика) Незаменимый C++ 37 / 131
  • 38.
    C++ vs. Asm(или как завалить Asm разработчика) Незаменимый C++ 38 / 131
  • 39.
  • 40.
  • 41.
    C++ vs. Rust+ Отличная безопасность? Незаменимый C++ 41 / 131
  • 42.
    C++ vs. Rust+ Отличная безопасность? + Потенциальная возможность оптимизировать лучше C++ Незаменимый C++ 42 / 131
  • 43.
    Заблуждение №3 Rust более/такойже производительный как C++ Незаменимый C++
  • 44.
    Анатомия компилятора (упрощённо) НезаменимыйC++ С++С Rust ... Middle end Ada Go IR IR Power PCx86 Alpha ...Arm x86_64 44 / 131
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
    C++ vs. RustВроде норм. Незаменимый C++ 51 / 131
  • 52.
    C++ vs. RustВроде норм. Переходим на Rust? Незаменимый C++ 52 / 131
  • 53.
    C++ vs. RustВроде норм. Переходим на Rust? Oh, wait!.. Незаменимый C++ 53 / 131
  • 54.
    C++ vs. RustВроде норм. Переходим на Rust? Oh, wait!.. C C++ — noop→ C Rust — PAIN!!!!!!!→ Незаменимый C++ 54 / 131
  • 55.
    C Rust→ ● unsafe {}нет безопасности→ Незаменимый C++ 55 / 131
  • 56.
    C Rust→ ● unsafe {}нет безопасности→ ● Нет возможности использовать C headers ● Надо генерировать свои – Обновление библиотек — БОЛЬ! – Надо headers руками допатчивать – Мучительные страдания с borrow checker на сложных С проектах [https://hackernoon.com/why-im-dropping- rust-fd1c32986c88] Незаменимый C++ 56 / 131
  • 57.
    Заблуждение №4 Программа написаннаяна языке Rust X не содержит ошибок Незаменимый C++
  • 58.
    Anything ● unsafe или аналогинет безопасности→ Незаменимый C++ 58 / 131
  • 59.
    Anything ● unsafe или аналогинет безопасности→ ● если ваша программа компилится, это ещё не значит что всё ОК Незаменимый C++ 59 / 131
  • 60.
  • 61.
  • 62.
    C++ vs. Go- <великое множество> Незаменимый C++ 62 / 131
  • 63.
    C++ vs. Go- <великое множество> + Асинхронность и многопточность на основе корутин Незаменимый C++ 63 / 131
  • 64.
    C++ vs. Go- <великое множество> + Асинхронность и многопточность на основе корутин ● Boost.Fibers Незаменимый C++ 64 / 131
  • 65.
    C++ vs. Go- <великое множество> + Асинхронность и многопточность на основе корутин ● Boost.Fibers ● Yandex.Taxi userver Незаменимый C++ 65 / 131
  • 66.
    C++ vs. Go- <великое множество> + Асинхронность и многопточность на основе корутин ● Boost.Fibers ● Yandex.Taxi userver ● Quantum Незаменимый C++ 66 / 131
  • 67.
    C++ vs. Go- <великое множество> + Асинхронность и многопточность на основе корутин ● Boost.Fibers ● Yandex.Taxi userver ● Quantum ● Folly fibers Незаменимый C++ 67 / 131
  • 68.
    C++ vs. Go- <великое множество> + Асинхронность и многопточность на основе корутин ● Boost.Fibers ● Yandex.Taxi userver ● Quantum ● Folly fibers ● Coroutines TS Незаменимый C++ 68 / 131
  • 69.
    C++ vs. Go- <великое множество> + Асинхронность и многопточность на основе корутин ● Boost.Fibers ● Yandex.Taxi userver ● Quantum ● Folly fibers ● Coroutines TS ● C++20 Незаменимый C++ 69 / 131
  • 70.
    Python vs. GoGo скорее конкурент Python, чем C++ Незаменимый C++ 70 / 131
  • 71.
    Заблуждение №5 Бенчмарки показываютчто прогарммы на X быстрее C++ Незаменимый C++
  • 72.
    Добро пожаловать вмир «честных» бенчмарков! Незаменимый C++
  • 73.
  • 74.
    Типичные ошибки ● Отключается сборщик мусора ● Коднаписан не на C++ Незаменимый C++ 74 / 131
  • 75.
    Типичные ошибки ● Отключается сборщик мусора ● Кодна C++ написан в стиле float* f = new float; Незаменимый C++ 75 / 131
  • 76.
    Типичные ошибки ● Отключается сборщик мусора ● Кодна C++ написан в стиле float* f = new float; ● На Х написана другая программа Незаменимый C++ 76 / 131
  • 77.
    Типичные ошибки ● Отключается сборщик мусора ● Кодна C++ написан в стиле float* f = new float; ● На Х написана другая программа ● Тестируется библиотека а не язык Незаменимый C++ 77 / 131
  • 78.
    Заблуждение №6 Сборщик мусоране добавляет накладных расходов Незаменимый C++
  • 79.
  • 80.
    structures struct list_node { list_node*next; list_node* prev; }; struct slist_node { slist_node* next; }; Незаменимый C++ 80 / 131
  • 81.
  • 82.
    structures vector<void*> root; //root[0] — это slist_node или list_node? Незаменимый C++ 82 / 131
  • 83.
    structures vector<void*> root; //Сколько указателей и где они? vector<Object*> root; Незаменимый C++ 83 / 131
  • 84.
    structures struct list_node { __metavptr; list_node* next; list_node* prev; }; struct slist_node { __meta vptr; slist_node* next; }; Незаменимый C++ 84 / 131
  • 85.
    Stop the world● Все потоки останавливаются Незаменимый C++ 85 / 131
  • 86.
    Stop the world● Все потоки останавливаются ● Проходим по всем узлам графа, помечая достижимые узлы Незаменимый C++ 86 / 131
  • 87.
    Stop the world● Все потоки останавливаются ● Проходим по всем узлам графа, помечая достижимые узлы ● ???? Незаменимый C++ 87 / 131
  • 88.
    Stop the world● Все потоки останавливаются ● Проходим по всем узлам графа, помечая достижимые узлы ● ???? ● Profit Незаменимый C++ 88 / 131
  • 89.
    Stop the world● Все потоки останавливаются ● Проходим по всем узлам графа, помечая достижимые узлы ● ???? ● Profit ● На современном железе больше 1 ядра! Незаменимый C++ 89 / 131
  • 90.
    Stop the world● Все потоки останавливаются ● Проходим по всем узлам графа, помечая достижимые узлы ● ???? ● Profit ● На современном железе больше 1 ядра! ● При каждой сборке мусора мы проходимся по всем узлам постоянно перепроверяя живые→ узлы Незаменимый C++ 90 / 131
  • 91.
    No stop the world ● Ничегоне останавливается Незаменимый C++ 91 / 131
  • 92.
    No stop the world ● Ничегоне останавливается ● Многопоточно разбираем мусор Незаменимый C++ 92 / 131
  • 93.
    No stop the world ● Ничегоне останавливается ● Многопоточно разбираем мусор ● Ура! Незаменимый C++ 93 / 131
  • 94.
    No stop the world ● Ничегоне останавливается ● Многопоточно разбираем мусор ● Ура! ● НО Незаменимый C++ 94 / 131
  • 95.
    No stop the world ● Ничегоне останавливается ● Многопоточно разбираем мусор ● Ура! ● НО ● Нам нужно синхронизировать все потоки через атомарные инструкции Незаменимый C++ 95 / 131
  • 96.
    No stop the world ● Ничегоне останавливается ● Многопоточно разбираем мусор ● Ура! ● НО ● Нам нужно синхронизировать все потоки через атомарные инструкции ● Это очень дорого, если не мы последними трогали ресурс Незаменимый C++ 96 / 131
  • 97.
    No stop the world ● Ничегоне останавливается ● Многопоточно разбираем мусор ● Ура! ● НО ● Нам нужно синхронизировать все потоки через атомарные инструкции ● Это очень дорого, если не мы последними трогали ресурс ● Мы делаем это при каждой сборке мусора! Незаменимый C++ 97 / 131
  • 98.
    + Не проходим лишниеразы Незаменимый C++ 98 / 131
  • 99.
    structures struct list_node { shared_ptr<list_node>next; // atomic refcounter shared_ptr<list_node> prev; // atomic refcounter }; struct slist_node { shared_ptr<slist_node> next; // atomic refcounter }; Незаменимый C++ 99 / 131
  • 100.
    Это ещё невсё! shared_ptr<Object> some; Незаменимый C++ 100 / 131
  • 101.
    Это ещё невсё! shared_ptr<Object> some; // Скоро будет больно! Незаменимый C++ 101 / 131
  • 102.
    Это ещё невсё! shared_ptr<Object> some; // Скоро будет больно! shared_ptr<Object> prev = some.a; // ... Незаменимый C++ 102 / 131
  • 103.
    Это ещё невсё! shared_ptr<Object> some; // Скоро будет больно! shared_ptr<Object> prev = some.a; // ... prev.a = some; // Циклические ссылки! Незаменимый C++ 103 / 131
  • 104.
  • 105.
  • 106.
    Trade-offs ● Плавающий мусор ● …или удар по производительности Незаменимый C++ 106 / 131
  • 107.
    Trade-offs ● Плавающий мусор ● …или удар по производительности ● Останавливать все потоки и тормозить с непредсказуемыми задержками Незаменимый C++ 107 / 131
  • 108.
    Trade-offs ● Плавающий мусор ● …или удар по производительности ● Останавливать все потоки и тормозить с непредсказуемыми задержками ● … или ничего не останавливать и тратить CPU такты впустую Незаменимый C++ 108 / 131
  • 109.
    Trade-offs ● Плавающий мусор ● …или удар по производительности ● Останавливать все потоки и тормозить с непредсказуемыми задержками ● … или ничего не останавливать и тратить CPU такты впустую ● Плата за Object* Незаменимый C++ 109 / 131
  • 110.
    С++ vs. (Java+ C#) Незаменимый C++
  • 111.
  • 112.
    C# ?? Java● См. «Сборщики Мусора» Незаменимый C++ 112 / 131
  • 113.
    Logstash – Программадля сбора, трансформации и складирования логов. Бесплатное и очень популярное Open Source приложение на Java. Что может пойти не так? Незаменимый C++ 113 / 131
  • 114.
    Logstash – Программадля сбора, трансформации и складирования логов. Бесплатное и очень популярное Open Source приложение на Java. Что может пойти не так? Незаменимый C++ 114 / 131
  • 115.
  • 116.
  • 117.
    C++ - скрытыйвысокий порог вхождения - неограниченные возможности - проблемы с безопасностью Незаменимый C++ 117 / 131
  • 118.
    C++ - скрытыйвысокий порог вхождения - неограниченные возможности - проблемы с безопасностью - отсутствие изкоробочности - крошечная стандартная библиотека - отсутствие готовой инфраструктуры Незаменимый C++ 118 / 131
  • 119.
    ОК, а чтоделать то? Незаменимый C++
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
    Итоги ● C++ везде ● C++крайне популярен Незаменимый C++ 124 / 131
  • 125.
    Итоги ● C++ везде ● C++крайне популярен ● С++ - самый производительный инструмент для написания больших приложений Незаменимый C++ 125 / 131
  • 126.
    Итоги ● C++ везде ● C++крайне популярен ● С++ - самый производительный инструмент для написания больших приложений ● Относитесь со скепсисом к бенчмаркам Незаменимый C++ 126 / 131
  • 127.
    Итоги ● C++ везде ● C++крайне популярен ● С++ - самый производительный инструмент для написания больших приложений ● Относитесь со скепсисом к бенчмаркам ● Не верьте managed языкам, которые говорят что они быстрее C++ Незаменимый C++ 127 / 131
  • 128.
    Итоги ● C++ везде ● C++крайне популярен ● С++ - самый производительный инструмент для написания больших приложений ● Относитесь со скепсисом к бенчмаркам ● Не верьте managed языкам, которые говорят что они быстрее C++ ● С++ не идеален!.. Незаменимый C++ 128 / 131
  • 129.
    Итоги ● C++ везде ● C++крайне популярен ● С++ - самый производительный инструмент для написания больших приложений ● Относитесь со скепсисом к бенчмаркам ● Не верьте managed языкам, которые говорят что они быстрее C++ ● С++ не идеален!.. ● ...но это исправимо Незаменимый C++ 129 / 131
  • 130.
  • 131.
    Полухин Антон Старший разработчикYandex.Taxi antoshkka@yandex-team.ru antoshkka@gmail.com https://github.com/apolukhin https://stdcpp.ru/