Создание быстродействующего распределителя памяти, для std::vector или замена глобальных операций выделения памяти |
Здравствуйте, гость ( Вход | Регистрация )
Создание быстродействующего распределителя памяти, для std::vector или замена глобальных операций выделения памяти |
AD |
29.6.2009, 10:38
Сообщение
#1
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Раньше был обычный массив (динамический), который содержал значения определенных параметров, прочитанных из лог-файла (широта, долгота, скорость и пр.). Сейчас сделал в виде вектора. Вместо оператора new теперь использую resize. Но так как эти операции чересчур затратные (а цикл может содержать и 100000 итераций (где каждый раз происходит выделение)), то стало необходимо сделать алгоритм немного по-другому.
Выделять память блоками. Т.е. вместо след. операций: code1 Делать следующее: code2 При замене на QVector code1 перешел в следующий: code3
Как переписать code2 для использования в векторе QVector? Заранее благодарен за помощь.... Сообщение отредактировал AD - 30.6.2009, 15:08 |
|
|
Tonal |
30.6.2009, 10:54
Сообщение
#2
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
Можешь написать свой, проще зацепить из буста.
Где-то я встречал библиотечку шаблонов для лёгкого написания аллокаторов stl - думал в бусте, сейчас не вспомню... |
|
|
AD |
30.6.2009, 11:11
Сообщение
#3
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Можешь написать свой, проще зацепить из буста. Где-то я встречал библиотечку шаблонов для лёгкого написания аллокаторов stl - думал в бусте, сейчас не вспомню... Думаю, тогда может попробовать написать свой! Если что, поможете? Надо научиться их писать! Заодно увидеть, как это все устроено. А то одной теории из Саттера, маловато будет! |
|
|
AD |
30.6.2009, 12:09
Сообщение
#4
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
да, кстати, а мне нужно наследоваться от стандартного аллокатора? Или полностью "свои велосипеды" писать?
|
|
|
AD |
30.6.2009, 14:09
Сообщение
#5
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Странно, как-то не очень помогло. Или я что-то забыл?
allocator
Вот как использую
В чем еще могут быть проблемы? Что-то еще следует дописать? |
|
|
Tonal |
1.7.2009, 8:47
Сообщение
#6
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
Странно, как-то не очень помогло. Или я что-то забыл? ... В чем еще могут быть проблемы? Что-то еще следует дописать? Ты выделяешь столько памяти, сколько просит клиент (std::vector). Ровно это же и делает стандартный аллокатор. Т.е. ты ничего не выигрываешь. Для того, чтобы получить эффект, нужно изменить стратегии выделения - например выделять память сразу большими блоками, а потом раздавать на них место. Попробуй таки зацепить аллокатор из буста - хоть посмотришь к чему надо стремиться. Да, можно ещё такой финт провернуть: При разборе блока параметры загоняешь в список - std::list с быстрым аллокатором. Когда блок разобран, создаёшь массив std::vector или обычный массив с уже известным размером и копируешь туда данные. Если все блоки не очень большого размера, то можно выделить для аллокатора списка сразу память под самый большой блок и переразмещений в нём не будет. И массивы будут размещаться всего один раз. Стало быть получим количество выделений памяти в идеале: кол-во блоков + 1. А переразмещений не будет вовсе - что сильно снизает нагрузку на всю подсистему памяти. |
|
|
AD |
1.7.2009, 9:05
Сообщение
#7
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Ты выделяешь столько памяти, сколько просит клиент (std::vector). Ровно это же и делает стандартный аллокатор. Т.е. ты ничего не выигрываешь. Для того, чтобы получить эффект, нужно изменить стратегии выделения - например выделять память сразу большими блоками, а потом раздавать на них место. Попробуй таки зацепить аллокатор из буста - хоть посмотришь к чему надо стремиться. Я аллокатор из буста и смотрел. Вот именно большими блоками и хочу выделять. Можешь на коде показать, как это провернуть? Я не очень понимаю... Да, можно ещё такой финт провернуть: При разборе блока параметры загоняешь в список - std::list с быстрым аллокатором. Когда блок разобран, создаёшь массив std::vector или обычный массив с уже известным размером и копируешь туда данные. Если все блоки не очень большого размера, то можно выделить для аллокатора списка сразу память под самый большой блок и переразмещений в нём не будет. И массивы будут размещаться всего один раз. Стало быть получим количество выделений памяти в идеале: кол-во блоков + 1. А переразмещений не будет вовсе - что сильно снизает нагрузку на всю подсистему памяти. Спасибо большое. Мне бы хоть пример небольшой, тогда смогу сделать, а так сложно представить, как это реализовать! |
|
|
Tonal |
1.7.2009, 10:44
Сообщение
#8
|
Активный участник Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17 |
Попробуй таки зацепить аллокатор из буста - хоть посмотришь к чему надо стремиться. Я аллокатор из буста и смотрел. Вот именно большими блоками и хочу выделять. Можешь на коде показать, как это провернуть? Я не очень понимаю... Вот и смотри как там работают с памятью. А подключить действительно просто - бостовский пул не требует подключения библиотек - только хедеров и пути к ним. Кстати, в том коде, который ты приводил в сообщении 13 Попробуй сделать для LOGRECORD конструктор с размером параметров:
Конструирование вектора сразу нужного размера выгоднее, чем конструирование пустого, с последующим его увеличением. П.С. Да, можно ещё такой финт провернуть... Спасибо большое. Мне бы хоть пример небольшой, тогда смогу сделать, а так сложно представить, как это реализовать! Рассмотрел ещё раз твой код и подумал, что я похоже фигню написал. |
|
|
AD |
1.7.2009, 10:50
Сообщение
#9
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Вот и смотри как там работают с памятью. А подключить действительно просто - бостовский пул не требует подключения библиотек - только хедеров и пути к ним. Подключение буста - не решение. Довольно много причин, по которым я не хочу его подключать! Вот я и задаю вопросы, рассмотрев код буста, вообще-то! Кстати, в том коде, который ты приводил в сообщении 13 Попробуй сделать для LOGRECORD конструктор с размером параметров:
Конструирование вектора сразу нужного размера выгоднее, чем конструирование пустого, с последующим его увеличением. Это я уже сделал! П.С. Рассмотрел ещё раз твой код и подумал, что я похоже фигню написал. В чем именно? |
|
|
Текстовая версия | Сейчас: 15.1.2025, 16:09 |