Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Менеджеры памяти, целесообразность использования 
:(
    Опции темы
3,14
Дата 10.7.2009, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: нет
Всего: 24



Есть многопоточное приложение, к-ое каждую секунду создает и удаляет до 6000 объектов. Имеет ли смысл заменить создание/удаление объектов с помощью new/delete на использование менеджера памяти? Даст ли это какой то выигрыш?
Ссылки на литературу и результаты тестирования приветствуются.


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
maxim1000
Дата 10.7.2009, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



по-хорошему, для таких решений стоит провести измерение времени, которое программа проводит в operator new и operator delete.

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

например, если где-то часто выделяются объекты одинакового размера - можно использовать аллокаторы для фиксированных блоков памяти, есть, например, в boost-е


--------------------
qqq
PM WWW   Вверх
Ln78
Дата 10.7.2009, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 274
Регистрация: 25.11.2006

Репутация: 13
Всего: 15



Думаю, что универсальный ответ дать не получится, зависит от конкретной задачи. 
Цитата(maxim1000 @  10.7.2009,  09:37 Найти цитируемый пост)
по-хорошему, для таких решений стоит провести измерение времени, которое программа проводит в operator new и operator delete.

А с учётом акцента на том, что приложение многопоточное, замерить время на использование объектов синхронизации. Т.е. получить 3 оценки для времени: без операторов выделения памяти и объектов синхронизации, с одним и со вторым.
Когда я занимался вычислительными задачами (там все вычисления проводились в одном отдельном потоке), в котором использовались объекты типа векторов и матриц, использование собственного менеджера памяти (его методы вызывались в конструкторах/деструкторах объектов) позволило существенно увеличить производительность. 
PM MAIL   Вверх
Lazin
Дата 10.7.2009, 10:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(3 @ 14, 10.7.2009,  08:12 Найти цитируемый пост)
Есть многопоточное приложение, к-ое каждую секунду создает и удаляет до 6000 объектов.

здесь можно использовать не менеджер памяти, а пулл объектов, что-бы не создавать и удалять их каждый раз, а использовать раннее созданные объекты
PM MAIL Skype GTalk   Вверх
Alexeis
Дата 10.7.2009, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



  6000 объектов в секунду это не мало. Может имеет смысл переписать код так чтобы объекты создавались в стеке и уничтожались по выходу из функции? Если число объектов не известно, то можно воспользоваться функцией alloca для выделения в стеке участков произвольного размера и очистки по выходу, только нужно следить чтобы не было переполнения стека.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Lazin
Дата 10.7.2009, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



размещать много данных в стеке - не самая лучшая идея, так как это приведет к потере производительности smile 
PM MAIL Skype GTalk   Вверх
avnemchenko
Дата 10.7.2009, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 10.7.2009

Репутация: нет
Всего: нет



Когда-то я создавал приложение, где с XML-файла бралась куча данных, на их основе строились новые. Там каждую секунду многомерные сложные конструкции динамически создавались, потом уничтожались (это было тестирование с большим количеством внешне задаваемых опций). И весьма скоро у меня все стало ВИСЕТЬ, по-черному  smile  ! Висело оно там из-за неучтенных new/delete, которые как-то друг на друга накладывались.
Тогда я озверел, за недельку написал менеджер памяти. И в итоге 1) исчезли все проблемы с зависанием, т. к. все происходило в моей памяти, и не было динамических обращений к чему-то за ее пределами, 2) также я смог проконтролировать всякие перекрытия и их устранить, и 3) быстродействие ощутимо подскочило. Так что рекомендую!
Как потом оказалось, у меня были проблемы с созданием текстовых строк - иной раз одно накладывалось на другое, или вообще в пустоту ссылалось...
Теперь я везде использую эту свою библиотеку. Она у меня многопоточная (использую критические секции из Win API), стабильно и быстро работает. Теперь, правда, возникла неожиданная проблема - я себе резервирую кучу памяти. А когда я подключаю к своему приложению несколько своих же DLL-ек, и все они тоже резервируют кучу памяти, ее в итоге не хватает ... Буду дальше ее совершенствовать.
А тем, кто не любит изобретать велосипеды, лучше брать что-то из Boost.
PM ICQ   Вверх
Леопольд
Дата 10.7.2009, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(3 @ 14,10.7.2009,  08:12)
Есть многопоточное приложение, к-ое каждую секунду создает и удаляет до 6000 объектов. Имеет ли смысл заменить создание/удаление объектов с помощью new/delete на использование менеджера памяти? Даст ли это какой то выигрыш?
Ссылки на литературу и результаты тестирования приветствуются.

На мой взгляд рекомендация Lazin о пуле лучшая. Я, наверное, перегрузил бы new - delete с использованием пула. И использовал бы "умные" указатели что бы не "парится" об исключениях.

Добавлено @ 12:43
Цитата(avnemchenko @ 10.7.2009,  12:29)
А тем, кто не любит изобретать велосипеды, лучше брать что-то из Boost.

Мне кажется это нарвится всем...  А в boost'е, как минимум, отдебажено не одним пользователем. Больше времени и внимания можно уделить остальному коду.

Это сообщение отредактировал(а) Леопольд - 10.7.2009, 12:48


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
avnemchenko
Дата 10.7.2009, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 10.7.2009

Репутация: нет
Всего: нет



Цитата(Леопольд @ 10.7.2009,  12:39)
Добавлено @ 12:43
Цитата(avnemchenko @ 10.7.2009,  12:29)
А тем, кто не любит изобретать велосипеды, лучше брать что-то из Boost.

Мне кажется это нарвится всем...  А в boost'е, как минимум, отдебажено не одним пользователем. Больше времени и внимания можно уделить остальному коду.

Угу. А вот насчет доверия другим библиотекам - было дело, в фирме писали мы компилятор здоровенный (пишется он на трех континентах сотней разработчиков). И там они использовали реализацию std:: от Silicon Graphics - там были одни заморочки 9глюки и баги). Потом подключили реализацию от Microsoft - там оказались другие баги. И меня это так задолбало, что я решил делать СВОЮ библиотеку, где будут МОИ баги! И я их буду исправлять в режиме реального времени, а не ждать месяцами, когда там прочухается поставщик библиотеки!

Не спорю - это не самый быстрый путь. Зато самый надежный.
PM ICQ   Вверх
vinick
Дата 10.7.2009, 13:30 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 3
Всего: 22



Цитата(Lazin @  10.7.2009,  11:40 Найти цитируемый пост)
размещать много данных в стеке - не самая лучшая идея, так как это приведет к потере производительности

Можно узнать почему? Я всегда считал, что работа со стеком происходит гораздо быстрее чем с кучей.
PM MAIL ICQ Jabber   Вверх
Alexeis
Дата 10.7.2009, 13:59 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Lazin
Дата 10.7.2009, 15:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(Alexeis @  10.7.2009,  13:59 Найти цитируемый пост)
vinick, думаю тут дело в алгоритмах, стековый объект нельзя вернуть по ссылке, только копию, но я имел ввиду построить алгоритм так чтобы то что должно быть выделено выделялось вместе со входом в функцию и после обработки уничтожалось, без того чтобы его копировать
если стека не хватает, то генерируется исключение и стек либо расширяется, либо, если это невозможно - программа падает, поэтому, хранить большие объемы данных в стеке - не правильно, для этого есть куча smile 
PM MAIL Skype GTalk   Вверх
3,14
Дата 10.7.2009, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1614
Регистрация: 18.6.2004
Где: Н. Новгород

Репутация: нет
Всего: 24



Хм, а у меня вопрос как замерить производительность. Идея в том что сейчас проблем не наблюдается. Но пока нет основной функциональности, к-ая давала бы основную нагрузку. Я боюсь что возникнут проблемы на дальнейших стадиях, но просто так переписывать все на те же пулы тоже не хочется, а вдруг выигрыш будет пустяковый на самом деле? 
Собственно вопрос в том проводились ли какие либо тесты на этот счет и как протестировать что то подобное у себя? Могут ли возникнуть какие нибудь узкие места с многопоточным менеджером памяти у C++, и как результат лишние затраты на синхрониззацию?


--------------------
Может быть, это только мой бред,
Может быть, жизнь не так хороша,
Может быть, я не выйду на свет,
Но я летал, когда пела душа...
PM MAIL   Вверх
Alexeis
Дата 10.7.2009, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(Lazin @  10.7.2009,  14:08 Найти цитируемый пост)
если стека не хватает, то генерируется исключение и стек либо расширяется, либо, если это невозможно - программа падает, поэтому, хранить большие объемы данных в стеке - не правильно, для этого есть куча

  Во-первых в настройках компилятора есть параметр - размер стека, вычисляешь сколько тебе максимум надо, умножаешь в 2 раза и ставишь как максимальный размер. Во-вторых если стек будет возрастать, то уже уменьшаться не будет, поэтому временные затраты на расширение стека это разовые затраты. Их не нужно учитывать.
  ОЗУ оно и в Африке ОЗУ, будет ли это стек или пул. Если юзать кучу то быстрее точно не будет. Факт в том что объект живет короткое время, а затраты на одну операцию выделения значительны. Уже есть встроенный механизм, не вижу смысла зачем его дублировать своим? 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Леопольд
Дата 10.7.2009, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(avnemchenko @ 10.7.2009,  13:23)
...
Угу. А вот насчет доверия другим библиотекам - ... - там были одни заморочки 9глюки и баги).
...
И я их буду исправлять в режиме реального времени, а не ждать месяцами, когда там прочухается поставщик библиотеки!

Не спорю - это не самый быстрый путь. Зато самый надежный.

Не соглашусь...

Просто надо пользовать заслужившие доверие open source библиотеки. Например, boost, wxWidgets... Думаю, их можно пользовать спокойно, именно потому что уже отдебажено другими пользователями. К тому же, если всё же есть бага в такой библиотеке, то её можно дебажить самому, в режиме реального времени... Обычно это быстрее чем написать свою библиотеку с высокой степенью надёжностью, такой-же сложности.

Это сообщение отредактировал(а) Леопольд - 10.7.2009, 19:01


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0671 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.