Создание быстродействующего распределителя памяти, для std::vector или замена глобальных операций выделения памяти |
Здравствуйте, гость ( Вход | Регистрация )
Создание быстродействующего распределителя памяти, для std::vector или замена глобальных операций выделения памяти |
AD |
30.6.2009, 14:59
Сообщение
#31
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Влад, исходя из твоих слов, следует заменить глобальные new и delete!
P.S. Изначально, именно для ускорения работы программы и затеялась вся канитель! Сообщение отредактировал AD - 30.6.2009, 15:01 |
|
|
Tonal |
1.7.2009, 8:47
Сообщение
#32
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
Странно, как-то не очень помогло. Или я что-то забыл? ... В чем еще могут быть проблемы? Что-то еще следует дописать? Ты выделяешь столько памяти, сколько просит клиент (std::vector). Ровно это же и делает стандартный аллокатор. Т.е. ты ничего не выигрываешь. Для того, чтобы получить эффект, нужно изменить стратегии выделения - например выделять память сразу большими блоками, а потом раздавать на них место. Попробуй таки зацепить аллокатор из буста - хоть посмотришь к чему надо стремиться. Да, можно ещё такой финт провернуть: При разборе блока параметры загоняешь в список - std::list с быстрым аллокатором. Когда блок разобран, создаёшь массив std::vector или обычный массив с уже известным размером и копируешь туда данные. Если все блоки не очень большого размера, то можно выделить для аллокатора списка сразу память под самый большой блок и переразмещений в нём не будет. И массивы будут размещаться всего один раз. Стало быть получим количество выделений памяти в идеале: кол-во блоков + 1. А переразмещений не будет вовсе - что сильно снизает нагрузку на всю подсистему памяти. |
|
|
AD |
1.7.2009, 9:05
Сообщение
#33
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Ты выделяешь столько памяти, сколько просит клиент (std::vector). Ровно это же и делает стандартный аллокатор. Т.е. ты ничего не выигрываешь. Для того, чтобы получить эффект, нужно изменить стратегии выделения - например выделять память сразу большими блоками, а потом раздавать на них место. Попробуй таки зацепить аллокатор из буста - хоть посмотришь к чему надо стремиться. Я аллокатор из буста и смотрел. Вот именно большими блоками и хочу выделять. Можешь на коде показать, как это провернуть? Я не очень понимаю... Да, можно ещё такой финт провернуть: При разборе блока параметры загоняешь в список - std::list с быстрым аллокатором. Когда блок разобран, создаёшь массив std::vector или обычный массив с уже известным размером и копируешь туда данные. Если все блоки не очень большого размера, то можно выделить для аллокатора списка сразу память под самый большой блок и переразмещений в нём не будет. И массивы будут размещаться всего один раз. Стало быть получим количество выделений памяти в идеале: кол-во блоков + 1. А переразмещений не будет вовсе - что сильно снизает нагрузку на всю подсистему памяти. Спасибо большое. Мне бы хоть пример небольшой, тогда смогу сделать, а так сложно представить, как это реализовать! |
|
|
AD |
1.7.2009, 9:59
Сообщение
#34
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
В boost в файле allocator.hpp нашел следующий код:
Беда в том, что я не нашел в std данного типа: std::alloc! И что это за alloc_type::allocate(), alloc_type::deallocate() не смог узнать и найти код реализации этих функций. Буду благодарен за помощь в реализации корректной стратегии выделения памяти. |
|
|
BRE |
1.7.2009, 10:37
Сообщение
#35
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Почитай вот эту тему. В конце есть готовый алокатор, с примером.
Стратегия там такая, выделяется один кусок памяти под 1K объектов (chunk), когда память в нем заканчивается, выделяется следующий chunk и т.д. Блин, ссылку забыл приложить. http://forum.sources.ru/index.php?showtopic=249933 Сообщение отредактировал BRE - 1.7.2009, 10:38 |
|
|
Tonal |
1.7.2009, 10:44
Сообщение
#36
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
Попробуй таки зацепить аллокатор из буста - хоть посмотришь к чему надо стремиться. Я аллокатор из буста и смотрел. Вот именно большими блоками и хочу выделять. Можешь на коде показать, как это провернуть? Я не очень понимаю... Вот и смотри как там работают с памятью. А подключить действительно просто - бостовский пул не требует подключения библиотек - только хедеров и пути к ним. Кстати, в том коде, который ты приводил в сообщении 13 Попробуй сделать для LOGRECORD конструктор с размером параметров:
Конструирование вектора сразу нужного размера выгоднее, чем конструирование пустого, с последующим его увеличением. П.С. Да, можно ещё такой финт провернуть... Спасибо большое. Мне бы хоть пример небольшой, тогда смогу сделать, а так сложно представить, как это реализовать! Рассмотрел ещё раз твой код и подумал, что я похоже фигню написал. |
|
|
AD |
1.7.2009, 10:50
Сообщение
#37
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Вот и смотри как там работают с памятью. А подключить действительно просто - бостовский пул не требует подключения библиотек - только хедеров и пути к ним. Подключение буста - не решение. Довольно много причин, по которым я не хочу его подключать! Вот я и задаю вопросы, рассмотрев код буста, вообще-то! Кстати, в том коде, который ты приводил в сообщении 13 Попробуй сделать для LOGRECORD конструктор с размером параметров:
Конструирование вектора сразу нужного размера выгоднее, чем конструирование пустого, с последующим его увеличением. Это я уже сделал! П.С. Рассмотрел ещё раз твой код и подумал, что я похоже фигню написал. В чем именно? |
|
|
AD |
1.7.2009, 14:55
Сообщение
#38
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Вот блин. Сделал следующий распределитель:
allocator
Загрузка 5 логов, объемом записей в 7038 грузилось 8-9 секунд. Нехорошо! Что-то опять-таки не так реализовал? Или взял не тот распределитель? в чем теперь проблемы? Сообщение отредактировал AD - 1.7.2009, 15:16 |
|
|
BRE |
1.7.2009, 15:24
Сообщение
#39
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
А ты в профилировщике результаты смотрел, точно именно на выделении памяти такие тормоза?
|
|
|
AD |
1.7.2009, 15:57
Сообщение
#40
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
А ты в профилировщике результаты смотрел, точно именно на выделении памяти такие тормоза? Придется его еще раз подключать. Видимо, все-таки не только в выделении. Сейчас немного другую картинку наблюдаю! Надо будет еще раз профайлером пройтись. Что-то не то. Как-то по-другому теперь программа себя ведет! В смысле тормозит теперь в другом месте. Операция выделения теперь шустренькая. |
|
|
Текстовая версия | Сейчас: 15.1.2025, 11:55 |