Создание быстродействующего распределителя памяти, для 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 |
|
|
Влад |
2.7.2009, 13:38
Сообщение
#2
|
Участник Группа: Участник Сообщений: 146 Регистрация: 20.3.2009 Из: Санкт-Петербург Пользователь №: 627 Спасибо сказали: 46 раз(а) Репутация: 8 |
|
|
|
AD |
3.7.2009, 12:00
Сообщение
#3
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Так, получилось ускорение с помощью массивов (пока что достаточное, но не необходимое)!
На следующей неделе все-таки доразбираюсь с распределителем памяти и постараюсь перевести решение для векторов. Код следующий:
cpp-code
Именно строки для ускорения кода - вот:
Еще раз повторюсь, что с помощью векторов я все-таки постараюсь сделать корректный код, но чуть позже! СПАСИБО ВСЕМ ЗА ПОМОЩЬ! Еще, возможно, обращусь! Сообщение отредактировал AD - 3.7.2009, 12:04 |
|
|
AD |
6.7.2009, 17:36
Сообщение
#4
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Сделал распределитель памяти следующий:
allocator
Распределитель работает. Но работает ну очень медленно! Собственно код чтения остался тот, что я приводил до того, как снова перешел к массивам! Скачал тестовую версию VTune посмотрел на что уходит время. Основная нагрузка на функцию grow(). Что сделать, чтобы не было такой убийственно-долгой загрузки (даже пары-тройки файлов)? Где еще исправить и что? Вот результаты работы профилировщика: [attachment=697:intelVTune_results.JPG] А вот работа профилировщика при коде, который был приведен в прошлом посте, т.е. при работе с массивами: [attachment=698:intelVTu...ts_array.JPG] P.S. В обоих случаях я загружал один и тот же файл (один!)! Сообщение отредактировал AD - 6.7.2009, 17:41 |
|
|
AD |
7.7.2009, 11:07
Сообщение
#5
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Буду очень благодарен за любую помощь. Очень требуется - так как самому тяжело найти решение проблемы.
Выяснил, что выделение памяти происходит для каждого элемента, причем функция grow вызывается при добавлении одного элемента даже по несколько раз. Видимо, надо изменить саму технологию добавления? нет? Сейчас это происходит так:
Сообщение отредактировал AD - 7.7.2009, 11:09 |
|
|
Текстовая версия | Сейчас: 15.1.2025, 15:45 |