Size: a a a

2020 August 12

IZ

Ilia Zviagin in pro.cxx
Philipp Bondarev
Да, думаю, что не имеющий опыта работы с этим инструментом не даст ответ, даже хороший разработчик. Я задал этот вопрос на случай, что его прочитает кто-то, кто уже имел дело с подобной проблемой.
Найди Мейл лист по SWIG, спроси там...
Также тебе надо уточнить что куда откуда ты хочешь возвращать
источник

PB

Philipp Bondarev in pro.cxx
Ilia Zviagin
Найди Мейл лист по SWIG, спроси там...
Также тебе надо уточнить что куда откуда ты хочешь возвращать
Спасибо, порыскаю. Хотя, честно-говоря, никогда дел с мэйл листами не имел =)
А по поводу уточнить - хороший совет. Не могу представить, как это должно выглядеть. То есть, если разложить по полочкам.
В моей плюсовой библиотеке B есть класс, назовём его MyClass, в этом классе есть метод getRainbow, который возвращает указатель на объект класса из подключённой библиотеки A, скажем LibClass. Вроде всё просто и понятно пока, поехали дальше.
Есть обёртка для библиотеки A - _a она написана совершенно другими людьми. Если я в Python создаю объект класса LibClass, то благодаря этой обёртке могу дёргать его методы, видеть поля.
Тоже понятно.
Если я создаю обёртку _b для своей библиотеки, то в Python я могу из своего метода вернуть указатель на объект LibClass, но это будет не объект из обёртки _a, а просто свиговский какой-то объект, к его методам и полям доступа нет.
Вообще, понятное дело, чего бы это моя обёртка знала о чужой, с какой это радости вообще? В этом-то и вопрос, возможно ли как-то подружить две обёртки, мою и стороннюю. Фух, настрочил, сумбурненько всё-таки...
источник

AS

Anatoly Shirokov in pro.cxx
Philipp Bondarev
Спасибо, порыскаю. Хотя, честно-говоря, никогда дел с мэйл листами не имел =)
А по поводу уточнить - хороший совет. Не могу представить, как это должно выглядеть. То есть, если разложить по полочкам.
В моей плюсовой библиотеке B есть класс, назовём его MyClass, в этом классе есть метод getRainbow, который возвращает указатель на объект класса из подключённой библиотеки A, скажем LibClass. Вроде всё просто и понятно пока, поехали дальше.
Есть обёртка для библиотеки A - _a она написана совершенно другими людьми. Если я в Python создаю объект класса LibClass, то благодаря этой обёртке могу дёргать его методы, видеть поля.
Тоже понятно.
Если я создаю обёртку _b для своей библиотеки, то в Python я могу из своего метода вернуть указатель на объект LibClass, но это будет не объект из обёртки _a, а просто свиговский какой-то объект, к его методам и полям доступа нет.
Вообще, понятное дело, чего бы это моя обёртка знала о чужой, с какой это радости вообще? В этом-то и вопрос, возможно ли как-то подружить две обёртки, мою и стороннюю. Фух, настрочил, сумбурненько всё-таки...
ну, видится единственный вариант декорировать объект обертки своим классом и делегировать вызовы, но это будет работать при условии, что ты будешь принимать уже существующий LibClass извне и оборачивать его:
struct LibClass {
   virtual void foo() = 0;
...
};
struct MyClass {
        LibClass* getRainbow(LibClass* decorable) {
              struct LibClassDecorator : LibClass {
                       LibClass* decorable;
                       LibClassDecorator(LibClass* decorable) : decorable{decorable} {}
                       virtual void foo() override {
                               decorable->foo();
                       }
              };
              return new LibClassDecorator(decorable);
        }
};
источник

AS

Anatoly Shirokov in pro.cxx
но, это, вроде, вопрос не о С++ получается.
источник

PB

Philipp Bondarev in pro.cxx
Anatoly Shirokov
ну, видится единственный вариант декорировать объект обертки своим классом и делегировать вызовы, но это будет работать при условии, что ты будешь принимать уже существующий LibClass извне и оборачивать его:
struct LibClass {
   virtual void foo() = 0;
...
};
struct MyClass {
        LibClass* getRainbow(LibClass* decorable) {
              struct LibClassDecorator : LibClass {
                       LibClass* decorable;
                       LibClassDecorator(LibClass* decorable) : decorable{decorable} {}
                       virtual void foo() override {
                               decorable->foo();
                       }
              };
              return new LibClassDecorator(decorable);
        }
};
Хмм, надо разобраться, подумать. Спасибо за совет.
источник

PB

Philipp Bondarev in pro.cxx
Anatoly Shirokov
но, это, вроде, вопрос не о С++ получается.
В том-то и дело, вопрос на стыке и для моего уровня сложен.
источник

AS

Anatoly Shirokov in pro.cxx
Philipp Bondarev
В том-то и дело, вопрос на стыке и для моего уровня сложен.
просто стыковка с Python - это С интерфейс.
источник
2020 August 13

AZ

Alexander Zaitsev in pro.cxx
есть некий сервис на С++, который состоит из множества частей. Хотелось бы понимать в разные моменты времени, какие части приложения сколько выжрали оперативной памяти. То есть организовать достаточно детализированный профайлинг памяти для приложения.

Сейчас регулярно снимается стастика с аллокатора (jemalloc), но понятное дело, что это говорит только о ситуации для всего приложения.

Есть идеи, как подобное организовать?

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

Почему не используются готовые утилиты профайлинга - они не дают нужной точности.

Если важно - С++14
источник

AZ

Alexander Zaitsev in pro.cxx
Также есть вариант каждую подсистему заставить саму мочь подсчитать занятую память. Аля дергаешь метод GetMemoryConsumption() у каждой подсистемы, а она уже пошла по всем своим контейнерам это дело считать.

Но выглядит отвратительно, конечно же
источник

ИI

И Ivan in pro.cxx
Ну а что значит подсистемы? Функции занимают место только на стеке, что думаю не так много. Соответственно речь видимо идет о памяти в куче. Как правило, память в куче лежит в контейнерах (map, vector). Соответственно можно посмотреть сколько занимают эти контейнеры, или сняв статистику с аллокатора или просто вызывав size у контейнера
источник

AP

Alexander Potapov in pro.cxx
Не всегда тривиально обойти все контейнеры. Думаю реально самый простой способ сделать аллокаторы и трекать память через них
источник

AK

Alexey Kuznetsov in pro.cxx
Обычно профайлеры собирают коллстеки на все аллокации/деаллокации, если разрезолвить их символами, можно поматчить по модулям и сделать вьюшки удобные. Можно и руками это сделать. Что значит профайлеры не дают нужной точности?
источник

AK

Andrew Khoma in pro.cxx
Alexander Zaitsev
есть некий сервис на С++, который состоит из множества частей. Хотелось бы понимать в разные моменты времени, какие части приложения сколько выжрали оперативной памяти. То есть организовать достаточно детализированный профайлинг памяти для приложения.

Сейчас регулярно снимается стастика с аллокатора (jemalloc), но понятное дело, что это говорит только о ситуации для всего приложения.

Есть идеи, как подобное организовать?

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

Почему не используются готовые утилиты профайлинга - они не дают нужной точности.

Если важно - С++14
А почему бы просто не создать некого Owner-а каждому алокатору?
источник

АР

Андрей Руссков... in pro.cxx
Alexander Zaitsev
есть некий сервис на С++, который состоит из множества частей. Хотелось бы понимать в разные моменты времени, какие части приложения сколько выжрали оперативной памяти. То есть организовать достаточно детализированный профайлинг памяти для приложения.

Сейчас регулярно снимается стастика с аллокатора (jemalloc), но понятное дело, что это говорит только о ситуации для всего приложения.

Есть идеи, как подобное организовать?

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

Почему не используются готовые утилиты профайлинга - они не дают нужной точности.

Если важно - С++14
микросервисы? )
источник

AZ

Alexander Zaitsev in pro.cxx
И Ivan
Ну а что значит подсистемы? Функции занимают место только на стеке, что думаю не так много. Соответственно речь видимо идет о памяти в куче. Как правило, память в куче лежит в контейнерах (map, vector). Соответственно можно посмотреть сколько занимают эти контейнеры, или сняв статистику с аллокатора или просто вызывав size у контейнера
подсистема читай как обьект класса с кучей подобьектов
источник

АР

Андрей Руссков... in pro.cxx
можешь сделать так: основной процесс форкается в несколько частей, каждая из которых использует только какую-то часть
источник

AZ

Alexander Zaitsev in pro.cxx
Андрей Руссков
микросервисы? )
ну переписывать на микросервисы это никто не будет (и не надо). скорее похоже внутри на акторы немного, но это не акторы
источник

AZ

Alexander Zaitsev in pro.cxx
но от акторов до микросервисов... 😊
источник

АР

Андрей Руссков... in pro.cxx
минусы - надо делать кросспроцессные очереди, но по факту на концепцию акторов это не так уж и плохо накладывается
источник

AZ

Alexander Zaitsev in pro.cxx
Alexey Kuznetsov
Обычно профайлеры собирают коллстеки на все аллокации/деаллокации, если разрезолвить их символами, можно поматчить по модулям и сделать вьюшки удобные. Можно и руками это сделать. Что значит профайлеры не дают нужной точности?
если говорить про семплирующие, то сэмпл может не попасть на отрезок времени, в который произошло что-то важное
источник