C++ в играх, больших и не очень, Игорь Лобанчиков
С++, являясь прямым потомком C - одновременно гибкий и эффективный с точки зрения производительности язык. За счет оптимизирующего компилятора любой красиво и правильно написанный код будет быстрым, стабильным и безопасным. Ну, или нам бы этого очень хотелось.
На простых примерах из жизни мы рассмотрим благие намерения, куда они нас заводят и почему так получается.
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)aragozin
Обеспечение достойной производительности высокоуровневого языка с динамической типизацией - непростая задача. Just-in-time (JIT) компиляция - динамическая генерация машинного кода с учетом информации, собранной во время выполнения приложения - ключевой элемент производительности виртуальной машины (будь то Java, .NET или даже JavaScript). JIT-компилятор, в свою очередь, должен иметь впечатляющий набор трюков и оптимизаций, что бы компенсировать "динамизм" языка.
В докладе речь пойдет о достижениях современной JIT компиляции в целом и более подробно будут освещены особенности HotSpot JVM (бесплатной JVM от Oracle)
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
Шаблоны — мощный инструмент, добавляющий в язык новые возможности, а программистам в команде — новые проблемы. Доклад покажет, как тщательно продуманный шаблонный код может не усложнить, а упростить жизнь и дать надёжную абстракцию межпроцессных межъязыковых асинхронных вызовов функций. С помощью шаблонов можно:
адаптировать Promise/A+ из Javascript для C++
автоматически проверять и раскладывать динамический массив аргументов на статичные аргументы функции
сделать аналог std::bind для weak_ptr.
Эти вещи будут показаны на примере взаимных вызовов между C++ и Javascript в одном приложении с помощью CEF3.
о некоторых вопросах бинарной совместимости в C++corehard_by
При написании кода на C++ часто появляются вопросы о том, как он будет взаимодейтсвовать с внешним миром. Ответить на эти вопросы порой бывает нелегко, и причиной этому служит отсуствие описания ABI в стандарте C++. В докладе рассмотрим, что такое ABI, и как программисты C++ живут в отсутсвии стандарта на него.
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
Зачастую, знакомство с алиасингом в C++ у многих программистов начинается и заканчивается одинаково: -fno-strict-aliasing. На вопросы новичка, более опытные коллеги отвечают в стиле: «не трогай! а то все сломаешь!». Новичок и не трогает. В докладе будет предпринята попытка заглянуть под капот и понять, что же там, внутри. Что такое алиасинг, где он может быть полезен и какие реальные преимущества дает. Тема будет рассмотрена и со стороны программиста и со стороны разработчика компилятора. А по сему, вопрос «зачем?» будет центральным в повествовании.
JIT-компиляция в виртуальной машине Java (HighLoad++ 2013)aragozin
Обеспечение достойной производительности высокоуровневого языка с динамической типизацией - непростая задача. Just-in-time (JIT) компиляция - динамическая генерация машинного кода с учетом информации, собранной во время выполнения приложения - ключевой элемент производительности виртуальной машины (будь то Java, .NET или даже JavaScript). JIT-компилятор, в свою очередь, должен иметь впечатляющий набор трюков и оптимизаций, что бы компенсировать "динамизм" языка.
В докладе речь пойдет о достижениях современной JIT компиляции в целом и более подробно будут освещены особенности HotSpot JVM (бесплатной JVM от Oracle)
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
Шаблоны — мощный инструмент, добавляющий в язык новые возможности, а программистам в команде — новые проблемы. Доклад покажет, как тщательно продуманный шаблонный код может не усложнить, а упростить жизнь и дать надёжную абстракцию межпроцессных межъязыковых асинхронных вызовов функций. С помощью шаблонов можно:
адаптировать Promise/A+ из Javascript для C++
автоматически проверять и раскладывать динамический массив аргументов на статичные аргументы функции
сделать аналог std::bind для weak_ptr.
Эти вещи будут показаны на примере взаимных вызовов между C++ и Javascript в одном приложении с помощью CEF3.
о некоторых вопросах бинарной совместимости в C++corehard_by
При написании кода на C++ часто появляются вопросы о том, как он будет взаимодейтсвовать с внешним миром. Ответить на эти вопросы порой бывает нелегко, и причиной этому служит отсуствие описания ABI в стандарте C++. В докладе рассмотрим, что такое ABI, и как программисты C++ живут в отсутсвии стандарта на него.
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVMSergey Platonov
Зачастую, знакомство с алиасингом в C++ у многих программистов начинается и заканчивается одинаково: -fno-strict-aliasing. На вопросы новичка, более опытные коллеги отвечают в стиле: «не трогай! а то все сломаешь!». Новичок и не трогает. В докладе будет предпринята попытка заглянуть под капот и понять, что же там, внутри. Что такое алиасинг, где он может быть полезен и какие реальные преимущества дает. Тема будет рассмотрена и со стороны программиста и со стороны разработчика компилятора. А по сему, вопрос «зачем?» будет центральным в повествовании.
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
Кто-то верно подметил, что разработчики статических анализатора часто сталкиваются с "проблемой айсберга". Им сложно объяснить разработчикам, почему сложно написать и развивать статические анализаторы кода. Дело в том, что сторонние наблюдатели видят только вершину всего процесса, так как им доступен для изучения только простой интерфейс, который предоставляют анализаторы для взаимодействия с миром. Это ведь не графический редактор с сотнями кнопок и рычажков. В результате и возникает ощущение, что раз прост интерфейс взаимодействия, то и прост продукт. На самом деле статические анализаторы кода — это сложные программы, в которых живут и взаимодействуют разнообразнейшие методы поиска дефектов. В них реализуется множество экспертные системы, выдающие заключения о коде на основе как точных, так и эмпирических алгоритмах. В парном докладе, основатели анализатора PVS-Studio расскажут о том, как незаметно потратить 10 лет, чтобы написать хороший анализатор. Дьявол кроется в деталях!
Как показывает практика, повсеместное применение классического, основанного на callback’ах подхода к асинхронному программированию обычно оказывается неудобным. Для упрощения написания и поддержки сложного асинхронного кода можно использовать иной подход — с использованием сопрограмм. Он значительно сокращает объём и сложность кода, превращая код из асинхронного в синхронный.
что пришлось тестировать и о чем узнать при подготовке Linux версии pvs-studiocorehard_by
Большинство программистов плохо представляют, что означает создание PVS-Studio для Linux. Многие думают, что вся сложность в портировании кода, однако это очень далеко от истины: портировать код очень просто, однако это только 5% работы. Остальная работа скрыта от стороннего наблюдателя и заключается в решении многих инфраструктурных вопросов. Предлагаем заглянуть на кухню разработчиков анализатора PVS-Studio и узнать разные интересные нюансы их работы.
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...Yandex
Доклад посвящён преимуществам и недостаткам C++ в сравнении с C и ассемблером в контексте разработки критичных к производительности библиотек, использующих специфичные для платформы возможности. На примерах реализации оптимизированных компонентов аудио- и видеокодеков мы рассмотрим, как можно упростить исходный код с помощью нестандартных расширений компилятора и новых возможностей C++11. Внимание также будет уделено функциональности, которой не хватает в текущих реализациях компилятора. В качестве целевых платформ используются ARMv7+NEON/ARM64, но предварительного знакомства с ними не требуется.
Григорий Демченко, Асинхронность и неблокирующая синхронизацияSergey Platonov
Практика показывает, что использование подхода, основанного на колбеках для асинхронного программирования обычно не является удобным и подвержено различным ошибкам. Для упрощения написания и поддержки сложных асинхронных программ можно использовать несколько иной подход: использовать сопрограммы для переключения контекста на время ожидания события. Такой подход позволяет реализовать интересные неблокирующие примитивы, включая неблокирующее сетевое взаимодействие, неблокирующие мьютексы, а также удобное переключение между различными пулами потоков для разнесения выполнения задач, которые требуют различные ресурсы.
Причины потерь процессорного времени при организации последовательности вычислений внутри потока: 1. Ожидание ответа на запрос (поток спит). 2. Выполнение дополнительных "лишних" действий. Как способ устранения этих потерь - паттерн Пул потоков. Анализ императивного и функционального подхода к борьбе с "жадными" операциями. Эволюция методов организации параллельных вычислений на основе пула потоков.
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...Alexander Borzunov
Описание декоратора для автоматической оптимизации алгоритмов с помощью быстрого возведения матриц в степень в Python.
Смотрите подробнее:
GitHub: https://github.com/borzunov/cpmoptimize
Хабрахабр: http://habrahabr.ru/post/236689/
Python Package Index: https://pypi.python.org/pypi/cpmoptimize
Построение компилятора на базе LLVM — Павел СычевYandex
Мы поговорим про компиляторы и их архитектуру. Обсудим, что же такое LLVM и зачем он нам нужен. Также рассмотрим, как написать компилятор простого языка программирования на LLVM.
В третьей главе рассматриваются базовые свойства акторов, описанные в PhD диссертации Gul Agha: каждый актор имеет адрес, большой почтовый ящик, куда доставляются сообщения, адресованные актору и поведение. В ответ на входящее сообщение актор может отправить конечный набор сообщений другим акторам и/или создать конечное число новых акторов и/или поменять свое поведение для обработки следующего сообщения.
В рамках данного курса будет разработана библиотека для разработки параллельных приложений на платформе .NET, построенная по модели акторов.
Исходные коды библиотеки будут выкладываться на GitHub: https://github.com/hwdtech/HWdTech.DS
Код библиотеки будет разработан с использованием следующих принципов, приемов и методик:
S.O.L.I.D. - принципы
Unit-tests
Mock
IoC контейнеры
Для удобства слушателей курса краткий обзор данных практик приведен в Главе 4.
C++ in kernel mode, Roman Beleshev
Вы когда-нибудь писали драйвера для Windows? А на С++? Пора развенчать миф о том, что драйверописательство - это только С и только хардкор. О различиях между Kernel mode и User mode, о технических моментах реализации некоторых возможностей С++, и о том, что писать драйвера на С++ можно, нужно и очень приятно и увлекательно.
Actors for fun and profit, Евгений Охотников
На предыдущих конференциях C++ CoreHard автор уже рассказывал о Модели Акторов вообще и ее применимости в C++ в частности, а так же об уроках, которые довелось выучить за 15 лет использования Модели Акторов в C++. В этот раз речь зайдет о том, как же определить, стоит ли использовать Модель Акторов для решения конкретной задачи. И если стоит, то как это можно сделать. С поправкой на то, что C++ -- это небезопасный язык и приемы из намного более безопасных Erlang и Akka в C++ не очень-то и работают.
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
Кто-то верно подметил, что разработчики статических анализатора часто сталкиваются с "проблемой айсберга". Им сложно объяснить разработчикам, почему сложно написать и развивать статические анализаторы кода. Дело в том, что сторонние наблюдатели видят только вершину всего процесса, так как им доступен для изучения только простой интерфейс, который предоставляют анализаторы для взаимодействия с миром. Это ведь не графический редактор с сотнями кнопок и рычажков. В результате и возникает ощущение, что раз прост интерфейс взаимодействия, то и прост продукт. На самом деле статические анализаторы кода — это сложные программы, в которых живут и взаимодействуют разнообразнейшие методы поиска дефектов. В них реализуется множество экспертные системы, выдающие заключения о коде на основе как точных, так и эмпирических алгоритмах. В парном докладе, основатели анализатора PVS-Studio расскажут о том, как незаметно потратить 10 лет, чтобы написать хороший анализатор. Дьявол кроется в деталях!
Как показывает практика, повсеместное применение классического, основанного на callback’ах подхода к асинхронному программированию обычно оказывается неудобным. Для упрощения написания и поддержки сложного асинхронного кода можно использовать иной подход — с использованием сопрограмм. Он значительно сокращает объём и сложность кода, превращая код из асинхронного в синхронный.
что пришлось тестировать и о чем узнать при подготовке Linux версии pvs-studiocorehard_by
Большинство программистов плохо представляют, что означает создание PVS-Studio для Linux. Многие думают, что вся сложность в портировании кода, однако это очень далеко от истины: портировать код очень просто, однако это только 5% работы. Остальная работа скрыта от стороннего наблюдателя и заключается в решении многих инфраструктурных вопросов. Предлагаем заглянуть на кухню разработчиков анализатора PVS-Studio и узнать разные интересные нюансы их работы.
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...Yandex
Доклад посвящён преимуществам и недостаткам C++ в сравнении с C и ассемблером в контексте разработки критичных к производительности библиотек, использующих специфичные для платформы возможности. На примерах реализации оптимизированных компонентов аудио- и видеокодеков мы рассмотрим, как можно упростить исходный код с помощью нестандартных расширений компилятора и новых возможностей C++11. Внимание также будет уделено функциональности, которой не хватает в текущих реализациях компилятора. В качестве целевых платформ используются ARMv7+NEON/ARM64, но предварительного знакомства с ними не требуется.
Григорий Демченко, Асинхронность и неблокирующая синхронизацияSergey Platonov
Практика показывает, что использование подхода, основанного на колбеках для асинхронного программирования обычно не является удобным и подвержено различным ошибкам. Для упрощения написания и поддержки сложных асинхронных программ можно использовать несколько иной подход: использовать сопрограммы для переключения контекста на время ожидания события. Такой подход позволяет реализовать интересные неблокирующие примитивы, включая неблокирующее сетевое взаимодействие, неблокирующие мьютексы, а также удобное переключение между различными пулами потоков для разнесения выполнения задач, которые требуют различные ресурсы.
Причины потерь процессорного времени при организации последовательности вычислений внутри потока: 1. Ожидание ответа на запрос (поток спит). 2. Выполнение дополнительных "лишних" действий. Как способ устранения этих потерь - паттерн Пул потоков. Анализ императивного и функционального подхода к борьбе с "жадными" операциями. Эволюция методов организации параллельных вычислений на основе пула потоков.
Автоматическая оптимизация алгоритмов с помощью быстрого возведения матриц в ...Alexander Borzunov
Описание декоратора для автоматической оптимизации алгоритмов с помощью быстрого возведения матриц в степень в Python.
Смотрите подробнее:
GitHub: https://github.com/borzunov/cpmoptimize
Хабрахабр: http://habrahabr.ru/post/236689/
Python Package Index: https://pypi.python.org/pypi/cpmoptimize
Построение компилятора на базе LLVM — Павел СычевYandex
Мы поговорим про компиляторы и их архитектуру. Обсудим, что же такое LLVM и зачем он нам нужен. Также рассмотрим, как написать компилятор простого языка программирования на LLVM.
В третьей главе рассматриваются базовые свойства акторов, описанные в PhD диссертации Gul Agha: каждый актор имеет адрес, большой почтовый ящик, куда доставляются сообщения, адресованные актору и поведение. В ответ на входящее сообщение актор может отправить конечный набор сообщений другим акторам и/или создать конечное число новых акторов и/или поменять свое поведение для обработки следующего сообщения.
В рамках данного курса будет разработана библиотека для разработки параллельных приложений на платформе .NET, построенная по модели акторов.
Исходные коды библиотеки будут выкладываться на GitHub: https://github.com/hwdtech/HWdTech.DS
Код библиотеки будет разработан с использованием следующих принципов, приемов и методик:
S.O.L.I.D. - принципы
Unit-tests
Mock
IoC контейнеры
Для удобства слушателей курса краткий обзор данных практик приведен в Главе 4.
C++ in kernel mode, Roman Beleshev
Вы когда-нибудь писали драйвера для Windows? А на С++? Пора развенчать миф о том, что драйверописательство - это только С и только хардкор. О различиях между Kernel mode и User mode, о технических моментах реализации некоторых возможностей С++, и о том, что писать драйвера на С++ можно, нужно и очень приятно и увлекательно.
Actors for fun and profit, Евгений Охотников
На предыдущих конференциях C++ CoreHard автор уже рассказывал о Модели Акторов вообще и ее применимости в C++ в частности, а так же об уроках, которые довелось выучить за 15 лет использования Модели Акторов в C++. В этот раз речь зайдет о том, как же определить, стоит ли использовать Модель Акторов для решения конкретной задачи. И если стоит, то как это можно сделать. С поправкой на то, что C++ -- это небезопасный язык и приемы из намного более безопасных Erlang и Akka в C++ не очень-то и работают.
Restinio - header-only http and websocket servercorehard_by
Restinio - header-only http and websocket server, Николай Гродзицкий
RESTinio is a header-only library for creating REST applications in c++. It helps to create http server that can handle requests asynchronously. And since v.0.3 it supports websockets.
Analysis and interpretation of monitoring datacorehard_by
Analysis and interpretation of monitoring data, Юрий Ефимочев
Вам часто доводилось узнавать, что на практике что-то работает совершенно не так как вы планировали? В жизни реальность очень часто превосходит наши самые смелые ожидания. Поэтому хорошая обратная связь (мониторинг) является необходимым условием успеха любого крупного проекта. В своем докладе я расскажу какие практики мониторинга применяем мы на проекте SolarWinds Backup. А также поделюсь рядом интересных открытий и наблюдений сделанных в ходе анализа данных мониторинга.
MxxRu::externals: Repositoryless Dependency Manager, Евгений Охотников
Опыт управления зависимостями в C++ проекте без использования пакетных менеджеров и централизованных репозиториев пакетов.
(Не)чёткий поиск, Александр Зайцев
В Boost.Algorithm мы имеем методы для точного поиска паттерна в строке (даже в С++17 есть), но вот когда нам нужен поиск с допуском ошибок, начинаются некоторые проблемы. Я расскажу вам, какие проблемы есть и как они решаются.
C++Now Trip Report, Alexander Zaitsev
C++ активно развивается. И на конференциях по С++ представляют всё больше и больше интересных идей, куда может двигаться язык. На этом докладе вы услышите про самые интересные из них, которые были озвучены на конференции C++Now 2017.
Ускоряем сборку С++ проектов. Практика использования unity-сборокcorehard_by
Ускоряем сборку С++ проектов. Практика использования unity-сборок, Артем Лапицкий
Сборка крупных С++ проектов может занимать чрезвычайно много времени, что напрямую отражается на скорости разработки, эффективности тестирования и процесса непрерывной интеграции. В своем выступлении я расскажу об ускорении сборки с использованием техники "Unity Build" (Single Compilation Unit), а также об опыте и особенностях применения этой техники на реальном проекте.
Субъекторная модель, Григорий Демченко
Правда ли, что в С++ присутствует ООП? Сколько существует различных способов асинхронной синхронизации на сопрограммах в пользовательском пространстве? И, наконец, что такое "субъекторная модель" и чем она отличается от акторной модели? Обо всем этом и пойдет речь в данном докладе.
Behavior Driven Development в Автоматизации тестирования до сих пор порождает горячие дискуссии, так, кулуарный диалог об этом подходе после SQA Days 21 продолжался более часа, а границы применимости и не применимости, вопросы целесообразности и эффективности так и остались открытыми. Мы постараемся в диалоге, защищая две полярные позиции, расставить точки над И, в качестве заключительного аккорда доклада – диалога мы сформулируем алгоритм применимости и не применимости решения, что бы каждый слушатель смог использовать презентацию в качестве «шпаргалки» для принятия BDD решений
Обработка потока данных на примере deep packet inspection: внутренняя архитек...corehard_by
Обработка потока данных на примере deep packet inspection: внутренняя архитектура и решения, Максим Хижинский
Мы в компании VasExperts занимаемся задачами анализа сетевого трафика (DPI). Задача довольно нетривиальна, учитывая как объемы трафика у среднего провайдера (40 - 80Gb/s и выше), так и сложность распознания и обработки трафика - фильтрации, обеспечения требуемого QoS, терминации, управления локальными соединениями и пр. Очевидно, что обработка таких объемов должна быть параллельной, - следует загрузить все ядра по максимуму. Но неизбежно возникают разделяемые (shared) данные, доступ к которым из разных потоков при использовании традиционных инструментов - мьютексов и т.п. - фатальным образом влияет на производительность. Да что там shared data, - даже использование системного аллокатора - уже проблема. В докладе я расскажу о внутренней архитектуре нашего продукта - анализатора сетевого трафика: совсем немного о сетевых вещах и более подробно - о модели взаимодействия потоков и распределении их ролей, об аллокации памяти в такой модели, о спасительных интрузивных контейнерах, об ограничениях схем типа Hazard Pointer или user-space RCU поддержки конкурентных структур данных, и о том, почему мы не любим многопроцессорные сервера.
C++ and Assembly: Debugging and Reverse Engineeringcorehard_by
C++ and Assembly: Debugging and Reverse Engineering, Mike Gelfand
Мы привыкли рассматривать язык ассемблера как низкоуровневый. Пишем мы на нём сравнительно редко: для описания логики, невыразимой или трудновыразимой языками типа С++, или же для реализации критических ветвей исполнения, для которых компиляторы генерируют недостаточно оптимальный код. В своём докладе я расскажу о пользе базовых умений чтения и анализа ассемблерного кода и ситуациях, в которых желание время от времени опускаться на этот нижний уровень помогает решать проблемы и делать мир лучше.
Поиск уязвимостей с использованием статического анализа кодаcorehard_by
Поиск уязвимостей с использованием статического анализа кода, Андрей Карпов и Евгений Рыжков
В последнее время мы все слышим о новых и новых уязвимостях, обнаруженных в программном обеспечении. Уже стало очевидно, что писать код без уязвимостей человечество не может. Но могут ли современные инструменты разработки помочь обнаружить хотя бы некоторые ошибки? В докладе НЕ будет фраз типа «купите такой-то инструмент, чтобы не допускать уязвимостей в своем и чужом коде». На реальных примерах мы попробуем показать какие типы уязвимостей или по-другому программных дефектов могут быть найдены с помощью технологий анализа кода, а какие – пока нет. Ну и конечно как писать код так, чтобы снизить вероятность появления уязвимостей в своем коде.
The beast is becoming functional, Ivan Cukic
C++ has been stagnant for a long time, and while using many functional programming idioms with C++ was always possible, it was never easy. With each new version of the C++ standard, we have been getting better and better tools for writing functional and generic code. C++11 started by introducing lambdas, C++14 made lambdas much nicer to use, while C++17 went a few steps further by introducing algebraic data types like std::optional and std::variant. With C++20, the situation will become even better - ranges, concepts and coroutines will allow us to do even more. In this talk, we will explain how exactly these features fit into the FP style of programming.
Метаданные для кластера: гонка key-value-героев / Руслан Рагимов, Светлана Ла...Ontico
HighLoad++ 2017
Зал Дели + Калькутта, 7 ноября, 10:00
Тезисы:
http://www.highload.ru/2017/abstracts/2974.html
Обзоры и сравнения key-value баз данных, коих сегодня огромное количество, пестрят обещаниями миллионов операций в секунду с менее чем миллисекундными задержками.
Мы строим высокопроизводительный кластер хранения, и нам нужно где-то хранить метаданные. Одним из вариантов стали хвалёные key-value-решения. Справятся ли они с такой нагрузкой?
...
Многие из нас слышали, что при создании тестовых систем необходимо понимать из каких слоев они должны состоять. Но начинающим специалистам очень сложно четко понять за чем эти слои нужны и какие функции они выполняют. В своем докладе я хотел бы внести ясность по данному вопросу и ответить на все все вопросы.
Честное перформанс-тестирование / Дмитрий Пивоваров (ZeroTurnaround)Ontico
HighLoad++ 2017
Зал «Пекин+Шанхай», 7 ноября, 10:00
Тезисы:
http://www.highload.ru/2017/abstracts/3040.html
Стандартные статистические метрики не подходят для тестирования производительности приложений. Оценочные метрики, такие как средние или медианные значения, могут легко ввести в заблуждение, скрыв проблему.
Данный доклад продемонстрирует, почему среднее время отклика не имеет смысла, покажет, как с этим бороться, и предложит проверенную на практике альтернативу статистическому подходу.
Слайды одноименного доклада с конференции "C++ Russia 2018". В докладе речь идет о том, насколько C++ мешает и насколько C++ помогает в разработке акторного фреймворка для C++.
Porting existing games to Apple Metal API. Case study: Divinity Original Sin ...DevGAMM Conference
The session essentially focuses on case study of porting Divinity Original Sin 2 engine to Apple Metal API. Real-life examples are provided as well as a demo of frame capture, dissection and explanations of techniques used. The case study is followed by best practices section with advises for transitioning generic titles to Metal. The session concludes with ‘future tech’ section where advanced samples of Metal rendering technologies are displayed and briefly explained.
Publishing a Unity based Title on mobile, PC and consolesDevGAMM Conference
As we know the Unity allows us to develop one project on different platform from mobile till consoles. So how we can do it practically? Using experience existence game we talk about several necessary steps to publish project on PC/PS-4/Xbox one successfully.
#MadeWithUnity
Суперсилы Chrome DevTools — Роман Сальников, 2ГИСYandex
В своей работе мы постоянно используем инструменты, призванные облегчить нам жизнь. Но как хорошо мы ими на самом деле владеем? И почему мы пренебрегаем их суперсилами? Например, Chrome DevTools — это не только отладчик и инспектор HTML. Но когда у нас в руках молоток, кругом мерещатся гвозди. Десятки мегабайт и процентов загрузки процессора на вкладку браузера — верный признак того, что пора учиться пользоваться микроскопом.
Роман предложит освоить что-то посложнее молотка и расскажет о том, какую реальную пользу можно получить от профилирования, как найти в огромном отчёте проблему с кодом и что лучше — написать в коде десяток console.log или async debug.
Dmytro Nemesh "Building the perfect infrastructure with Kubernetes"Fwdays
Every company comes to a point where it’s infrastructure no longer fits team and business needs, and kludges are not working anymore. That’s the time to re-think and redesign the whole infrastructure. This is exactly where our company was half a year ago. I will talk about our experience dealing with this challenge while balancing between existing technology, costs, today’s reality and future needs.
(Не) преждевременная оптимизация проекта на Unreal Engine 4 / Владимир Алямки...DevGAMM Conference
В рамках лекции будет рассмотрен ряд уже имеющихся инструментов оптимизации на движке, о которых стоит знать, начиная работу над проектом. Доклад также затрагивает практическую основу и причины таких подходов, совмещая тематику архитектуры современных игровых движков и механик рендера сцены.
Доклад будет рассказывать о современных подходах проектирования ПО. Основной темой будет построение компонентных архитектур на примере архитектуры сцены 3D движка. Будет рассмотрен классический объектно-ориентированный подход организации сцены, его плюсы и минусы, и в качестве альтернативы будет показан компонентно ориентированный подход организации сцены. Доклад позволит слушателям понять, как разрабатывать сложные системы, которые впоследствии можно легко поддерживать.
Сергей Комлач "Итоги Google I/O: что нас ждет"Fwdays
Итоги Google I/O. Что нас ждет в 2016: Android N, DevTools, Daydream, Android Apps в Chrome OSи многое другое
Совсем недавно прошла ежегодная конференция Google I/O 2016, на которой было сделано ряд анонсов - новый Google Assistant, Android N, платформа Daydream, улучшенные DevTools, а так же Instant Apps и Android Apps в Chrome OS.
Я побывал на I/O и как очевидец, расскажу про все анонсы и инсайды конференции
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...corehard_by
Использование сторонних библиотек в языке C++ никогда не было простым - необходимо было правильно собрать их, имея дело с различными системами сборки, но с появлением пакетного менеджера conan.io процесс стал намного проще, так что теперь осталось только сделать пакеты для нужным библиотек, и в этом поможет команда bincrafter-ов.
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотниковcorehard_by
На предыдущих конференциях C++ CoreHard автор доклада рассказывал про Модель Акторов и опыт ее использования в C++. Но Модель Акторов -- это далеко не единственный способ борьбы со сложностью при работе с многопоточностью. Давайте попробуем поговорить о том, что еще можно применить и как это может выглядеть в C++.
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титовcorehard_by
Если вам важна скорость работы ваших программ, то вы обязаны понимать, как работает ваше "железо". Современный процессор -- это сложное устройство, многие механизмы которого могут неочевидным образом влиять на скорость исполнения вашего кода. В докладе дается обзорное представление основных структур современного процессора и подробно рассматривается работа иерархии памяти. Будут освещены следующие темы: организация кэш-памяти, принцип локальности, предподкачка данных, нежелательное общее владение данными, а также программные техники для эффективной работы с памятью.
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...corehard_by
Информационная безопасность все больше из отдельной сферы плавно перетекает в разработку ПО. А значит «обычным» программистам приходится понимать те требования и терминологию, которые специалисты по безопасности уже давно знают и используют. CWE, CERT, MISRA, SAST– для «обычных» программистов это непонятные аббревиатуры. Поэтому в обзорном докладе мы попробуем рассказать простым языком об этих понятиях так, чтобы все разработчики начали уверенно ориентироваться в этой теме.
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишковcorehard_by
Вот уже более двух лет мы создаём онлайн-специализацию по С++ на платформе Coursera. Её цель — обучить языку C++ с нуля до уровня, достаточного для решения практических задач, с которыми приходилось сталкиваться авторам в своей практике. В своём докладе я расскажу, как мы создаём наши онлайн-курсы, и уделю особое внимание техническим проблемам, которые нам пришлось решить в процессе создания автоматической системы проверки программ студентов.
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...corehard_by
В докладе обсуждаются способы улучшения времени сборки C++ проектов, опыт полученный в ходе ускорения сборки клиента и тулов World Of Tanks. Также описывается эффект, который они оказывают на организацию кодобазы (как позитивный, так и негативный) и затраты, которые необходимы для поддержки этих решений, т.к. не все они бесплатны. Методики, описываемые в докладе: ускорение линковки (Incremental Linking, Fastlink), ускорение компиляции(Include what you use, использование precompiled headers).
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...corehard_by
Доклад посвящён вопросам реализации пропозала Герба Саттера PR0707 (метаклассы в С++) за пределами компилятор - в виде отдельной утилиты. Будет продемонстрированы варианты использования метаклассов в реальной жизни, затронуты вопросы их реализации на базе Clang Frontend, а также возможные перспективы развития технологии и методики.
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...corehard_by
Все мы знаем, что компиляторы в настоящее время достаточно умные. И нам как программистам зачастую не нужно думать о каких-то незначительных оптимизациях - мы полагаемся на оптимизации компилятора. Что ж, настало время выяснить, действительно ли настолько компиляторы умны и узнать, в каких местах программист всё же (может быть) умнее.
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...corehard_by
В докладе будет рассмотрена генерация кода при компиляции различных языковых конструкций, как простых, так и сложных, на различных платформах, как общераспространённых x86/x64, так и тех, которым уделяется меньше внимания: ARM, AVR. Также будут встречаться примеры для совсем экзотических процессоров вроде PowerPC и даже MicroBlaze. Основной упор будет делаться не на обработку данных, а именно на сопоставление различных конструкций кода с инструкциями целевых платформ.
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...corehard_by
What do threads, atomic variables, mutexes, and conditional variables have in common? They are the basic building blocks of any concurrent application in C++, which are even for the experienced C++ programmers a big challenge. This massively changed with C++17 and change even more with C++20/23. What did we get with C++17, what can we hope for with C++20/23? With C++17, most of the standard template library algorithms are available in sequential, parallel, and vectorised variants. With the upcoming standards, we can look forward to executors, transactional memory, significantly improved futures and coroutines. To make it short. These are just the highlights from the concurrent and parallel perspective. Thus there is the hope that in the future C++ abstractions such as executors, transactional memory, futures and coroutines are used and that threads, atomic variables, mutexes and condition variables are just implementation details.
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...corehard_by
Язык C++, претерпев долгую эволюцию, обрёл ряд черт, характерных для функциональной парадигмы: функции стали полноправными объектами, над которыми могут выполняться операции, а аппарат шаблонов позволяет проводить вычисления на типах на этапе компиляции. Математический фундамент этих двух главных аспектов составляют, соответственно, ламбда-исчисление и теория категорий. Расширение языка этими средствами способствовало реализации на языке C++ ряда инструментов, известных из функционального программирования. Некоторые из этих реализаций вошли в стандартную библиотеку (std::function, std::bind), другие - в сторонние библиотеки, в том числе в коллекцию библиотек Boost (functional, hana). Важную роль в арсенале функционального программирования играют операции свёртки и развёртки, которые очевиднее всего определяются для списков, но также естественным образом обобщаются на другие индуктивные и коиндуктивные структуры данных. Например, суммирование списка чисел можно представить себе как свёртку списка по операции сложения, а построение списка простых множителей заданного целого числа - как развёртку. Обобщения свёртки и развёртки известны как анаморфизмы и катаморфизмы. Также в функциональном программировании находит применение понятие гиломорфизма - композиция развёртки некоторого объекта в коллекцию с последующей свёрткой её в новый объект. В докладе продемонстрировано, что свёртки, развёртки и их композиции допускают довольно простую реализацию на языке C++.
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филоновcorehard_by
Доклад посвящен часто используемому шаблону в моих проектах по анализу данных, когда обучение и настройка моделей происходят с использованием python, а вот их запуск в промышленное использование на языке C++. Предлагается рассмотреть несколько учебных примеров реализации такого подхода, от простой линейной регрессии до обработки изображений с помощью нейронных сетей.
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukićcorehard_by
This talk will be about the design and implementation of a reactive programming model inspired by ranges that allows easy implementation of asynchronous and distributed software systems by writing code that looks like a sequence of ordinary range transformations like filter, transform, etc. This programming model will be demonstrated along with the implementation of a simple asynchronous web service where the whole system logic is defined as a chain of range transformations.
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakovacorehard_by
Macros, templates, compile-time evaluation and code generation, reflection and metaclasses – C++ tends to hide the final code passed to the compiler under the tons of various names and aliases. Add here the preprocessor that shadows the actual running curve of your program with dozens of alternatives mixed in a non-trivial way. While this allows to avoid boilerplate code and reduce copy-paste and other errors, such an approach demands better tooling support to make the debugging process easier. To find an error in such a code, one has to continuously read-fix-run it and compare the results with some etalon, or to debug in order to find actual substitutions. But should you really wait until your code is run or even compiled to debug it? Or how to deal with the situations when the code can’t be run on the local machine? A text editor with code completion won’t help, while a smart IDE that “gets” your code can do a better job. In this talk we’ll see interesting approaches to solving cases like macro and typedef ‘debug’, understanding types when auto/decltype hide them, dealing with different code branches depending on the preprocessor’s pass-through, and other ideas. Some suggestions are already implemented as ready-to-use features in CLion and ReSharper C++, tools for C++ from JetBrains (that means I can show it in action), others are planned for the future. The aim of this talk is to share the workflows supported by the tools that can help C++ developers create better modern C++ code.
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухинcorehard_by
В C++11 добавили новое ключевое слово - constexpr. Выглядит оно весьма невзрачно, да и на первый взгляд кажется, что смысла в нём маловато... Для чего же оно нужно, какие у него есть тайные супер способности и какую роль оно сыграет в дальнейшем развитии языка C++ - обо всём об этом мы и поговорим.
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...corehard_by
Text formatting has been a favorite problem of C++ library authors for a long time. The standard C++ iostreams have been criticized for being difficult to use due to their statefulness and slow due to runtime polymorphism. Despite its age, printf is still popular because of simplicity and speed. The Boost library offers two more alternatives, Boost.Format and Boost.LexicalCast. And finally, the P0645 standard proposal sponsored by Facebook is currently finding its way through the C++ committee. All these approaches are still firmly based on standard containers and iterators. But the Standard Library is changing radically with the advent of ranges, range adaptors and functional style programming in C++. Generating optimized code with metaprogramming is becoming standard fare. In this talk, I want to convince you that the combination of ranges with a bit of metaprogramming makes for a very elegant solution to the text formatting problem. We introduce a form of ranges with internal iteration, which are generating their elements one by one rather than exposing external iterators. We can use these generator ranges to represent the values to be formatted, conceptually turning them into lazily evaluated strings. These can be used just like regular strings are used today: in function returns; as standard algorithm input; embedded into other, equally lazily evaluated strings; and so on, before they are finally expanded for display. By choosing the right interfaces, we can optimize this expansion at compile-time, making it no less pretty to write, but more efficient to expand than any text formatting approaches that rely on format strings that must be parsed at runtime. I believe that this approach is the natural extension of a range-based future standard library to text formatting.
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019corehard_by
Память в компьютере - это не только гигабайты оперативной памяти в слоте, но и занятная абстракция. В докладе мы рассмотрим, как можно эту абстракцию использовать необычным образом для моделирования других абстракций - регистровых файлов периферийных устройств. Доклад будет полезен не только embedded-разработчикам, но и, возможно, заставит переосмыслить свой взгляд на память.
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019corehard_by
Как правило, можно положиться на то, что компилятор оптимизирует результирующий бинарный файл так, чтобы она работала максимально быстро. Но компилятор не знает на каких данных и на каком железе программа будет запущена. Плюс хотелось бы, чтобы компиляция занимала приемлемое время. Из-за этого результат может оказаться субоптимальным. Предлагаю на примерах для LLVM посмотреть как можно подсказать компилятору как оптимизировать программу и сделать результат лучше или хуже.
Мы напишем простейший веб-сервис из клиента и сервера на C++. На этом C++ часть закончится, и пойдет настройка окружения и инфраструктуры. Мы обеспечим детерминируемость сборки и прогона тестов. Облегчим последующее обновление зависимых библиотек. Автоматизируем статические проверки, верификацию кода, прогон тестов. Обеспечим доступность сервиса, настроим инфраструктуру, сбалансируем нагрузку, добавим автоматическое и ручное масштабирование. И под конец мы настроим continious delivery таким образом, что код будет на продакшене через 5 минут после реквеста, при этом даже невалидные изменения и ошибки программиста не смогут повлиять на его работу.
1. C++ в играх, больших и не
очень
Igor Lobanchikov, 2017
2. Игорь Лобанчиков
● Разрабатываю игры с 2003 года
● S.T.A.L.K.E.R.: Clear Sky
● Работаю с Confetti
● Эксперт по компьютерной графике
○ Помогаю улучшать и оптимизировать чужие проекты
○ Портирую игры на новые платформы
○ Intel, AMD, Qualcomm, Amazon и другие
● imixerpro(at)gmail(dot)com
3. О чем будем говорить
● Особенности применения C++ в играх
● Производительность
○ КЭШ: основы
○ Методы снижения производительности с использованием возможностей C++
4. Кросс-платформенность
● Разные устройства
○ Настольные: Win/Mac/Linux
○ Консоли: PS4/XBox One/Wii/Nintendo Switch
○ Мобильные: iOS/Android
● Разные компиляторы
○ MSVC
○ CLANG/LLVM
○ До недавнего времени GCC
5. Кросс-платформенность
● Комилятор обновляет владелец платформы
○ CLang/GCC может существенно отставать от выхода PC/Linux версии
○ MSVC под XBox One тоже отстает
● С++ runtime собирает владелец платформы
○ Может содержать баги
● Больше всего проблем с Android
○ Ранние версии Android NDK не содержали STL
○ gnustl поддерживает только С++11 и частично несовместима с Clang
○ Libc++ до сих пор в стадии beta
○ Проблемы при использовании CMake
● Ожидание новых платформ
○ А вдруг там будут проблемы с новыми стандартами
6. Кросс-платформенность
● Использование новых стандартов создает риски
○ Поддержка на всех платформах
○ Корректность на всех платформах
● Обновление компилятора (и SDK) создает риски
○ Обновление API
○ Android: unified header и Boost
7. Консервативность и реакционность
● Используется подмножество языка
○ Подмножество STL
○ Или свой собственный STL
○ Или полный запрет на STL
● Используются “устаревшие” стандарты
○ C++11 достаточно “стар”
● Vulcan API - основан на C
● Молодые специалисты недовольны
○ Хотят использовать “современный” инструментарий
8. Производительность
● Конфликт интересов
○ Картинка должна быть красивой
○ Мир богатым
○ Частота кадров высокой
● 60 кадров в секунду (16.6 мс на кадр)
○ 16.6мс vs 17.6мс = 60 FPS vs 57 FPS
○ 33.3мс vs 34.4мс = 30 FPS vs 29 FPS
● Casual vs AAA
○ Повышение FPS
○ Снижение энергопотребления
● AR приложения
○ Производительность критична
9. Производительность
● Использование инструментария
○ Оптимизация узких мест
● Использование опыта предыдущей разработки при проектировании
○ Оптимальные решения для целевых платформ
○ Субоптимальные - для иных существующих
○ Спекуляции относительно будущих
17. Shared pointer: снижение производительности
struct SortPair
{
size_t sortKey;
boost::shared_ptr<tBar> object;
bool operator< (...) {...}
}
std::vector<SortPair> sort_pairs_vector;
// fill the vector
std::stable_sort(
sort_pairs_vector.begin(),
sort_pairs_vector.end());
18. Shared pointer: снижение производительности
struct SortPair
{
size_t sortKey;
shared_ptr<tBar> object;
tBar *object;
bool operator< (...) {...}
}
std::vector<SortPair> sort_pairs_vector;
// fill the vector
std::stable_sort(
sort_pairs_vector.begin(),
sort_pairs_vector.end());
19. Управление временем жизни
● “Старые” графические API (Direct3D 11-, OpenGL / OpenGL ES)
○ Достаточно дорогие вызовы API
○ Дорогие настолько, что использование синхронизации не является критичным
21. Управление временем жизни
● “Новый” графические API (Direct3D 12, Vulcan, Metal*)
○ Достаточно дешевые вызовы API
○ Управление временем жизни объекта драйвером существенно влияет на стоимость
вызова
23. RTTI+исключения
● Традиционно отключаемое в крупных играх
○ Раздувает размер исполняемого файла (до 10%)
○ Влияет на производительность
○ Требует внимания при сборке
24. RTTI
● Занимает место
○ Для каждого класса с vtable компилятор создает структуру std::type_id
○ Структура содержит строку в качестве идентификатора имени класса
25. RTTI
● dynamic_cast<> обходит всю иерархию классов
○ Возможно, сравнивая строки для каждого узла (или их хеши)
Class A
Class B
Class C
Class D
Class E
26. исключения
● SetJump/LongJump
○ потребляет до 10% производительности даже если исключение не будет брошено
● “Zero-cost”
○ раздувает исполняемый файл
○ Если исключение брошено - дополнительные расходы на обработку
○ Рекомендуется использовать максимально редко
29. Old style exceptions handling speed -
http://www.codercorner.com/blog/?p=33
clang: no rtti or exceptions
http://llvm.org/docs/CodingStandards.html#ci_rtti_exceptions
Editor's Notes
Постараюсь избегать вкусовщины.
Такое может произойти с каждым
Разные компиляторы. GCC ушел, пришел LLVM: Нужно поддерживать сразу несколько платформ. Разные компиляторы (в основном MSVC и Clang/LLVM, но может быть GCC, или что-то экзотическое). Разные библиотеки STL
Платформы по прежнему отстают в обновлении своих версий компилятора.
Негативный опыт: Android NDK вышла без поддержки STL. Неизвестно, что произойдет при появлении новой платформы. (разница в восприятии при разработки крупных проектов и casual)
Разработчики также отстают: необходимо гарантировать стабильность окружения, не сломалось - не чини.
Зачастую поддержкой компилятора может заниматься один человек!
SONY регулярно проводит мержи, вливает исправление багов в основную ветку
Обновления отстают в связи с необходимостью тестирования
Android: не могу припомнить безпроблемную разработку.
Android: проблемы с отладкой, с профилированием.
В общем случае непонятно, как изменится производительность, что произойдет со старыми багами. Не известно, сможет ли код вообще собраться (NDK 15 и unified headers. Boost перестал собираться).
Ограничения: могут быть экстремальными, вплоть до C-like интерфейсов
Vulcan: А вдруг появится платформа без поддержки С
На каждом кадре однотипные повторяющиеся вычисления
Есть потребность в максимальной эффективности кода. Как следствие - необходимо четкое понимание, что будет происходить за кулисами компилятора.
Инфраструктурные потери, размазанные по приложению, практически невозможно исправить в дальнейшем, в отличии от алгоритмических (яркий пример - исключения, которые, до недавнего времени, стоили дорого вне зависимости от их возникновения).
Для казуальных vs AAA: узкие места проявляются позже
На каждом кадре однотипные повторяющиеся вычисления
Есть потребность в максимальной эффективности кода. Как следствие - необходимо четкое понимание, что будет происходить за кулисами компилятора.
Инфраструктурные потери, размазанные по приложению, практически невозможно исправить в дальнейшем, в отличии от алгоритмических (яркий пример - исключения, которые, до недавнего времени, стоили дорого вне зависимости от их возникновения).
Для казуальных vs AAA: узкие места проявляются позже
Затронем только простейшие моменты, необходимо уточнение.
Boost
Несколько лет назад были проблемы непосредственно с сортировкой. По какой-то причине в момент сортировки дергался счетчик. Сейчас проблема исчезла.
Дескрипторы ресурсов и таблицы дескрипторов
Каждая функция (почти) регистрирует создание объектов, границы try/catch блоков
Zero-cost: таблица, которая по значению PC позволяет определить, какие объекты необходимо разрушить,