BLAZINGLY FAST C++ Optimizations

Berna Builds
11 Feb 202518:10

Summary

TLDRВ этом видео рассказывается о процессе оптимизации C++ программы, которая генерирует случайные матчи для игры League of Legends. Автор делится своими опытами и успехами, начиная с небольших улучшений, таких как использование gzip для сжатия данных, до более сложных решений, включая оптимизацию генерации случайных чисел и работу с большими JSON-объектами. В процессе работы программист сталкивается с множеством проблем, таких как высокие затраты на создание случайных объектов и проблемы многозадачности, но в конце концов достигает впечатляющих результатов, увеличив производительность с 100 до 20 000 запросов в секунду.

Takeaways

  • 😀 Сначала оптимизация была связана с использованием gzip для уменьшения размера полезной нагрузки, что увеличило производительность с 100 до 170 запросов в секунду.
  • 😀 Инструменты для анализа производительности, такие как Flame Graph, помогли выявить узкие места в коде, например, затратность генерации случайных чисел.
  • 😀 В процессе оптимизации выяснилось, что создание нового устройства генерации случайных чисел для каждого запроса было чрезмерно затратным, и его нужно было вынести в глобальную область.
  • 😀 Оптимизация генерации случайных чисел с помощью батчирования значений улучшила производительность, так как теперь вместо многократных вызовов генерации происходило одно обращение за всеми значениями.
  • 😀 Использование вектора с заранее зарезервированной памятью повысило эффективность работы с данными, избавив от затратных операций увеличения и уменьшения емкости.
  • 😀 Вектор был переосмыслен, и теперь данные извлекаются с конца, что вместо затратных операций O(n) дает эффективные операции O(1).
  • 😀 При работе с JSON был использован метод хранения объектов JSON как переменных, что устранило необходимость многократного парсинга строк в JSON-объекты, что ускорило выполнение.
  • 😀 Использование констант и статических переменных на этапе компиляции вместо динамических структур данных позволило уменьшить накладные расходы на создание строк в функции генерации случайных строк.
  • 😀 Память и работа с векторами также были оптимизированы, путем передачи их по ссылке и избегания ненужных копий и перераспределений памяти.
  • 😀 Многозадачность привела к проблемам с гонками потоков, когда устройства генерации случайных чисел стали доступными для нескольких потоков, что было решено с помощью ключевого слова `thread_local` для локализации устройства генерации в каждом потоке.

Q & A

  • Какая была исходная проблема с производительностью программы?

    -Исходная проблема заключалась в том, что программа, которая должна была обрабатывать 100 запросов в секунду, работала значительно медленнее. В процессе работы код оказался медленным из-за неоптимизированных операций с памятью и генерацией случайных чисел.

  • Как использование Gzip сжало размер данных и повлияло на производительность?

    -Gzip сжало размер данных с 18 КБ до 2 КБ, что позволило увеличить количество запросов с 100 до 170 в секунду, поскольку сжатие данных снижает нагрузку на сеть и экономит пропускную способность.

  • Какой инструмент использовался для профилирования и какие результаты были получены?

    -Для профилирования использовался инструмент Flame Graph. Он показал, что около 40% времени процессора тратилось на класс случайных чисел, что указало на необходимость оптимизации этой части программы.

  • Какие изменения были внесены в работу с генератором случайных чисел?

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

  • Как изменилась производительность после оптимизации генерации случайных чисел?

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

  • Какая проблема была связана с использованием векторов в программе?

    -При работе с векторами было обнаружено, что использование операции `erase` для удаления элементов с начала вектора приводит к операции с линейной сложностью O(n), что замедляет программу. Было решено работать с вектором с конца, что позволяет выполнять операции с константной сложностью O(1).

  • Как было улучшено управление памятью векторами?

    -Для улучшения производительности вектору заранее выделялось достаточно памяти с помощью метода `reserve`, что предотвратило дополнительные операции по перераспределению памяти и увеличило скорость работы программы.

  • Что привело к улучшению работы с JSON в программе?

    -Избежав повторного преобразования строк в объекты JSON, использовав встроенные возможности библиотеки для хранения JSON в памяти напрямую, удалось существенно ускорить процесс работы с JSON, что привело к увеличению производительности.

  • Какая проблема была с многозадачностью и как она была решена?

    -Была обнаружена ошибка многозадачности, связанная с гонкой потоков, когда глобальные генераторы случайных чисел использовались слишком быстро несколькими потоками. Это приводило к сбоям программы. Решение состояло в использовании ключевого слова `thread_local`, что обеспечило создание локальных генераторов для каждого потока, устранив гонки.

  • Какой эффект оказало добавление блокировки при выводе на экран?

    -Когда программа начала работать быстрее, обнаружилось, что добавление выводов на экран (например, строк состояния) замедляло работу, поскольку это вызывало блокировки потоков. Ограничив частоту обновления экрана, производительность была значительно улучшена.

Outlines

plate

Этот раздел доступен только подписчикам платных тарифов. Пожалуйста, перейдите на платный тариф для доступа.

Перейти на платный тариф

Mindmap

plate

Этот раздел доступен только подписчикам платных тарифов. Пожалуйста, перейдите на платный тариф для доступа.

Перейти на платный тариф

Keywords

plate

Этот раздел доступен только подписчикам платных тарифов. Пожалуйста, перейдите на платный тариф для доступа.

Перейти на платный тариф

Highlights

plate

Этот раздел доступен только подписчикам платных тарифов. Пожалуйста, перейдите на платный тариф для доступа.

Перейти на платный тариф

Transcripts

plate

Этот раздел доступен только подписчикам платных тарифов. Пожалуйста, перейдите на платный тариф для доступа.

Перейти на платный тариф
Rate This

5.0 / 5 (0 votes)

Связанные теги
C++оптимизацияпроизводительностьразработка ПОпрограммированиемногозадачностьтестированиепроизводственные ошибкиработа с даннымипроект Papy