![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| xbarmaglot |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 149 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
Возникла проблема при обработке больших потоков данных. Данные представляют из себя пакеты из сети разного размера.
Профайлер показал, что большое время уходит на выделение памяти и вызов деструкторов стандартных контейнеров. Хотелось бы выделить большой кусок памяти и не вызывать оператор new при создании объекта, а просто резервировать память. При удалении объекта хотелось бы тоже не удалять ее, а просто помечать, что она свободна. Лишь только при нехватке перераспределить новую память. Существует ли такой глобальный аллокатор для всей библиотеки stl/ищщые? |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
В стандартной stl нет (IMHO). Но никто не мешает написать свой и подсовывать его stl'ным контейнерам
Как то так -
malloc/free заменяете на что надо (по вкусу) |
|||
|
||||
| baldman88 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: 3 Всего: 7 |
Возможно я неправ, но кажется немного странным то, что при работе с сетью на первое место выходит время на создание и уничтожение контейнеров. Может проблема именно в том, что не совсем правильно организована обработка полученных данных?
|
|||
|
||||
| xbarmaglot |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 149 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
Ну мне приходят пакеты, я их разбираю и далее передаю сам пакет и методанные на обработку и запись.
Поэтому сам пакет приходится хранить (т.е. копировать) и удалять по необходимости. |
|||
|
||||
| xbarmaglot |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 149 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
порылся в интернете - есть готовые быстрые аллокаторы. Например, boost::fast_pool_allocator, TLFS, ...
А можно ли его установить для stl/boost по-умолчанию, или нужно указывать при создании каждого контейнера? |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
||||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Полностью согласен. xbarmaglot, может у Вас режим Debug? Тогда перейдите в Release и Вы будете приятно удивлены.
Можно ж хранить указатель на пакет в shared_ptr, и вся передача его из контейнера в контейнер будет занимать 4 (или 8) байт на пакет. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| xbarmaglot |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 149 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
не совсем так. Мне приходит большой UDP, который фрагментируется на пакеты.
Само чтение из сокета - это копирование в локальный буфер. Фрагментация - это второе копирование уже чистого пакета в контейнер. А далее я уже гоняю умные указатели. Но когда пакет не нужен - удаление его. Получается, что как минимум один конструктор и один деструктор. Вот они и тупят, как показал профайлер |
|||
|
||||
| xbarmaglot |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 149 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
||||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Переопределить можно, но компилятор будет ругаться на дубликат определения Но можно сделать частичную специализацию allocator для ваших типов (если этого вам хватит) |
|||
|
||||
| xbarmaglot |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 149 Регистрация: 28.8.2012 Репутация: нет Всего: нет |
||||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Кому сложновато? xvr уже определил вам шаблонные классы для основных контейнеров. Нужно просто пройти рефракторингом по коду и переименовать названия контейнеров. Определять нужно не для каждой переменной, а 1 раз для каждого вида контейнера. В STL едва ли десяток контейнеров наберется и сомневаюсь что у вас используются все. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |