понедельник, 30 мая 2016 г.

[prog.c++] Интересное чтиво: "C++ for Games: Performance. Allocations and Data Locality"

Хорошая ссылка всплыла на reddit-е: "C++ for Games: Performance. Allocations and Data Locality". Для тех, кто не сталкивался с негативным влиянием на скорость приложения со стороны активной работы с динамической памятью, имеет смысл прочесть. Даже если вы и не занимаетесь разработкой игр.

Кстати говоря, описанные по ссылке эффекты имеют значения и для фреймворков вроде SObjectizer или C++ Actor Framework (а так же Akka, Vert.x, Quasar и пр.). Особенно для SObjectizer-а, т.к. SO-5 поддерживает доставку сообщения сразу нескольким получателям. А в таких сценариях без размещения объекта сообщения в динамической памяти трудно обойтись.

Ну и в SO-5 мы предприняли несколько шагов, дабы уменьшить влияние этих факторов. Так, можно управлять тем, как агент хранит свои подписки. Например, в векторе. Или в std::map, или в std::unordered_map. Еще один такой шаг -- это свойства mchain-ов, которые определяют, как работать с памятью под очередь сообщений в mchain-е: выделять ее один раз сразу или же по чуть-чуть по мере работы с mchain-ом. Еще один такой шаг -- это возможность отсылать и перепосылать заранее созданные экземпляры сообщений (т.е. без пересоздания экземпляра на каждый send).

Вот до чего руки пока не дошли, так это до преаллоцированных векторов сообщений для самих агентов. И до операции копирования содержимого сообщения в этот вектор. Для ряда сценариев, когда агенты работают с очень ограниченным количеством типов сообщений, этот подход сможет дать очень хорошее снижение накладных расходов. Причем, для воплощение этого сценария в жизнь очень в тему окажутся фичи C++11, т.к. variadic templates. Так, шаблонная функция send сможет вызывать placement new для размещения экземпляра сообщения прямо внутри преаллоцированного вектора сообщений агента(ов)-получателя.

Просто мы сами пока еще не сталкивались с ситуациями, где бы в реальном приложении существующий механизм доставки был бы тормозом. Поэтому пока руки еще и не дошли. Надеюсь, что дойдут :)

Отправить комментарий