Russian Qt Forum
Май 21, 2024, 05:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 ... 5   Вниз
  Печать  
Автор Тема: Хранение "хвостиков"  (Прочитано 23687 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Сентябрь 21, 2015, 10:23 »

Добрый день

Есть структура
Код
C++ (Qt)
struct CData {
int mValue;
....
std::vector <float> mTail;
};
И все в ней хорошо, если бы не одно "но" - по памяти она может оказаться весьма расходной. Когда mTail содержит приличное число эл-тов - все норм, расходы на вектор (и его пул) оправданы. Но часто тех эл-тов с гулькин "нос", всего 1-2. Часто число эл-тов фиксировано - но становится известным уже в runtime.

Какой выход (учитывая что структуры могут интенсивно удаляться/создаваться)?

Спасибо
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Сентябрь 21, 2015, 11:42 »

union?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #2 : Сентябрь 21, 2015, 13:43 »

преждевременная оптимизация - зло )
приведи реальные замеры, когда расходы хранения мешают быстродействию, расходу памяти
и почему не QList<float> ?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Сентябрь 21, 2015, 15:22 »

преждевременная оптимизация - зло )
Ну это давно уже "гимн ленивых" Улыбающийся

приведи реальные замеры, когда расходы хранения мешают быстродействию, расходу памяти
Кстати про быстродействие я ничего не говорил - сами догадались Улыбающийся. Ну предположим в структуре всего 2 члена - тогда на ее заполнении время будет тратиться на конструктор вектора, push_back и new->malloc

По памяти: 1 или 2 флота займут 4 или 8 байт. Пустой std::vector - уже 12 байт (больше в 64 бит) + выделит минимум 16 байт, да расходы на сам блок - вот Вам и перерасход в 3-4 раза. А Qt контейнеры еще жирнее

и почему не QList<float> ?
Потому что при размере float = 4 QList тоже сводится к вектору
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #4 : Сентябрь 21, 2015, 17:21 »

В принципе, std::vector можно инициализировать константным количеством элементов, и тогда push_back не будет занимать значимое время. Но если кол-во элементов известно заранее, может, есть смысл использовать что-то вроде QPair? Специфики задачи не знаю, но лично я иногда так и делаю.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Сентябрь 21, 2015, 17:40 »

Специфики задачи не знаю,
Ну пошли отмазки  Улыбающийся Никогда в С не делали такого?
Код
C++ (Qt)
struct CData {
int mValue;
....
int tailCount;
float mTail[1];
};
Но это некультурно, как то же самое цивильно?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #6 : Сентябрь 21, 2015, 17:55 »

Почему я про специфику говорю - я не знаю, насколько имеет смысл иметь структуру с переменным кол-вом флоатов, как часто сия конструкция используется и т.д. Если речь только о том, что неохота 1 или 2 флота в вектор паковать, можно сделать, например, базовую структуру вообще без вектора и потом 3 раза от нее наследоваться, расширив либо вектором, либо одним флотом, либо двумя (в итоге получим 4 типа данных, один из которых будет базовым для остальных). Но опять же - я не знаю, как предполагается использовать такие данные.

А что до "некультурного" кода... Ну да, нехорошо как-то, такое все таки имхо через Юнион лучше делать...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Сентябрь 21, 2015, 18:52 »

А что до "некультурного" кода... Ну да, нехорошо как-то, такое все таки имхо через Юнион лучше делать...
Какой-то странный union
Код
C++ (Qt)
union  {
float raz[1];
float dva[2];
float tri[3];
};
К чему это? Все равно размер по максимуму, эффект тот же что и
Код
C++ (Qt)
float mData[3];
 
Ну это проходит только когда максимум известен и достаточно мал. А может быть что все имеют по 1-2, но находится один урод у которого 100. Да и вообще как-то не похоже на решение взрослого дяди  Улыбающийся

..можно сделать, например, базовую структуру вообще без вектора и потом 3 раза от нее наследоваться, расширив либо вектором, либо одним флотом, либо двумя (в итоге получим 4 типа данных, один из которых будет базовым для остальных).
И потом у каждого виртуальный доступ к mTail - но классы-то разные, в контейнер их уже не положить, придется через указатели на базовый, не "плодим ли сущности"?

Вот если нет интенсивного удаления - тогда можно просто сложить флоты в др контейнер и хранить индекс данных в нем
Код
C++ (Qt)
struct CData {
int mValue;
....
int tailCount;  // если у каждого свой счетчик
int tailIndex;
};
Правда для доступа к флотам придется все время иметь под рукой 2-й контейнер (или разориться еще на указатель на него) - но в принципе терпимо. Но что делать если удалять надо, и часто?
« Последнее редактирование: Сентябрь 21, 2015, 18:54 от Igors » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #8 : Сентябрь 22, 2015, 00:40 »

Ну дык идея то хорошая как раз, завести пул объектов, при удалении помечать объект как убитый, но в памяти он останется, так что при повторном использовании сразу доступен Улыбающийся

Для максимального эффекта можно и несколько пулов завести.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #9 : Сентябрь 22, 2015, 08:45 »

А Qt контейнеры еще жирнее

замеры есть ?
не забываем о Copy-On-Write, Implicit Sharing и Growth Strategies
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Сентябрь 22, 2015, 09:45 »

Ну дык идея то хорошая как раз, завести пул объектов, при удалении помечать объект как убитый, но в памяти он останется, так что при повторном использовании сразу доступен Улыбающийся

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

замеры есть ?
не забываем о Copy-On-Write, Implicit Sharing и Growth Strategies
Я вижу что Вы много читали  Улыбающийся Но чем мощнее контейнер - тем больше накладные расходы. Это само по себе нормально, но речь как раз о ситуации(ях) когда эти расходы становятся неприятно велики (относительно полезной работы)
Записан
qate
Супер
******
Offline Offline

Сообщений: 1175


Просмотр профиля
« Ответ #11 : Сентябрь 22, 2015, 10:28 »

Это само по себе нормально, но речь как раз о ситуации(ях) когда эти расходы становятся неприятно велики (относительно полезной работы)

ну хоть один пример будет это подтверждающее ?
чтобы я кроме опыта чтения приобрел и практическое подтверждение )
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #12 : Сентябрь 22, 2015, 10:58 »

Как-то не выглядит "дешевым решением", если городить его для конкретного класса. Вот в общем виде - да, но что-то затрудняюсь выбрать подходящий стандартный контейнер.

В этом случае темплейт в руки Улыбающийся
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Сентябрь 22, 2015, 11:31 »

ну хоть один пример будет это подтверждающее ?
чтобы я кроме опыта чтения приобрел и практическое подтверждение )
Странно что у Вас проблемы с таким примером. Ну ладно, см. аттач. Рез-ты
Цитировать
(член структуры) time = 0.001   RAM = 203.1 Mb
(std:vector)         tine = 16.785  RAM = 1.38 Gb
(QList)                time = 17.968  RAM = 1.79 Gb
Да, и на MSVC в дебаге лучше его не запускать - не дождетесь.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Сентябрь 22, 2015, 11:33 »

В этом случае темплейт в руки Улыбающийся
Каким образом? Ведь число хранимых эл-тов известно в runtime (а не на компиляции), о чем уже говорилось выше
Записан
Страниц: [1] 2 3 ... 5   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.169 секунд. Запросов: 22.