Создание быстродействующего распределителя памяти, для std::vector или замена глобальных операций выделения памяти |
Здравствуйте, гость ( Вход | Регистрация )
Создание быстродействующего распределителя памяти, для std::vector или замена глобальных операций выделения памяти |
AD |
6.7.2009, 17:36
Сообщение
#51
|
Профессионал Группа: Участник Сообщений: 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
Сообщение
#52
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Буду очень благодарен за любую помощь. Очень требуется - так как самому тяжело найти решение проблемы.
Выяснил, что выделение памяти происходит для каждого элемента, причем функция grow вызывается при добавлении одного элемента даже по несколько раз. Видимо, надо изменить саму технологию добавления? нет? Сейчас это происходит так:
Сообщение отредактировал AD - 7.7.2009, 11:09 |
|
|
AD |
8.7.2009, 12:12
Сообщение
#53
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Так... Ну теперь я совсем не понимаю, почему при загрузке нескольких файлов такие задержки! (Посмотрел в профилировщике) :shock:
При этом программа зависает, забирая 99% процессорного времени. Тормоза на функции allocate! Не могу понять, где в ней в принципе, кроме grow, могут быть тормоза. В grow после корректного создания конструкторов LOGRECORD теперь заходит довольно редко! Код, слегка изменил. Вот так:
Буду благодарен, если подскажите в чем еще проблемы могут быть. |
|
|
AD |
9.7.2009, 17:10
Сообщение
#54
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Сделал так: вначале чтение всех файлов. Пихаем прочитанное в буфер. А затем уже ходим по буферу и распарсиваем.
Reading files
Как и предполагалось, это разделение не решило основную проблему - притормаживание. Пока что, так как при всех собственных распределителях памяти программа падает при выделении большого количества файлов оставил (пока!) стандартный распределитель памяти. Притормаживает в функции parseBlock(), на строках params.resize() Вот полный код функции:
Сообщение отредактировал AD - 9.7.2009, 17:10 |
|
|
AD |
13.7.2009, 11:40
Сообщение
#55
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Вот и смотри как там работают с памятью. А подключить действительно просто - бустовский пул не требует подключения библиотек - только хедеров и пути к ним. Хочу попробовать подключить boost(овский) pool_allocator. Как там с помощью-какой-то утилиты мне собрать нужные пути? Сможете помочь? Буду благодарен. |
|
|
Влад |
13.7.2009, 11:59
Сообщение
#56
|
Участник Группа: Участник Сообщений: 146 Регистрация: 20.3.2009 Из: Санкт-Петербург Пользователь №: 627 Спасибо сказали: 46 раз(а) Репутация: 8 |
Цитата bcp
Usage: bcp --list [options] module-list bcp --list-short [options] module-list bcp --report [options] module-list html-file bcp [options] module-list output-path Options: --boost=path sets the location of the boost tree to path --scan treat the module list as a list of (possibly non-boost) files to scan for boost dependencies --cvs only copy files under cvs version control --unix-lines make sure that all copied files use Unix style line endings module-list: a list of boost files or library names to copy html-file: the name of a html file to which the report will be written output-path: the path to which files will be copied |
|
|
AD |
13.7.2009, 17:30
Сообщение
#57
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Итак, сделал вырезку некоторых файлов из boost и добавил в свой проект.
Распределителем памяти сделал fast_pool_allocator. Скорость значительно улучшилась. Есть еще тормоза при загрузке 50 и более файлов, но это уже несмертельно и не так долго. Вот версия, с которой буду "жить" некоторое время. Потом оптимизирую отрисовку - должно улучшить результаты! Reading Logs
Если есть замечания, пишите, постараюсь учесть. Может быть, кому-то еще и пригодится то, что в этой теме было описано. Да.... Огромное спасибо Tonal(у), Владу, BRE за помощь! Без вас я бы не смог так улучшить код! Сообщение отредактировал AD - 14.7.2009, 14:34 |
|
|
Текстовая версия | Сейчас: 15.1.2025, 18:18 |