Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
3 / 3 / 2
Регистрация: 28.09.2013
Сообщений: 32

boost::pool

23.02.2014, 16:29. Показов 3437. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Начинаю изучать boost, понравилась идея пула объектов, решил потестить, ожидая существенное повышение производительности операций с памятью, решил взять такой пример - создаем boost::unordered_map генерируем 100000 ключей и соответственно 100000 значений (и те и те - строки), которые вставляем в нее. Сравниваю скорость с дефолтным аллокатором и с boostool;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <exception>
#include <string>
#include <stdexcept>
#include <boost\pool\pool_alloc.hpp>
#include <random>
#include <boost\regex.hpp>
 
#define BOOSTA
#ifdef BOOSTA
typedef std::basic_string<char, std::char_traits<char>, boost::pool_allocator<char> > astring;
#else
typedef std::string astring;
#endif
 
astring get_rand_string()
{
    astring str;
    str.reserve(32);
    std::random_device generator;
    std::uniform_int_distribution<int> distribution(97, 122);
    for (int i = 0; i < 32; i++)
        str.push_back(static_cast<char>(distribution(generator)));
    return str;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
#ifdef BOOSTA
    boost::unordered_map<astring, astring, boost::hash<astring>, std::equal_to<astring>, boost::fast_pool_allocator<std::pair<const astring, astring>>> map;
#else
    boost::unordered_map<astring, astring> map;
#endif
    for (int i = 0; i < 100000; i++)
        map[get_rand_string()] = get_rand_string();
    system("pause");
    return 0;
}
Так вот, на этом примере вариант с pool_allocator заметно медленнее чем стандартный. В чем причина? Если он на самом деле намного медленнее, в чем тогда смысл его использования? или я что-то не так делаю?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.02.2014, 16:29
Ответы с готовыми решениями:

Boost thread pool. Как остановить потоки?
Привет. Реализовал thread pool с помощью boost::thread_group и boost::asio::io_service for (unsigned int i = 0; i &lt;...

Boost начало работы: Undefined reference to `boost::system::generic_category() '
Добрый день Собственно говоря возникла необходимость использовать boost в работе. Поставил так: sudo apt-get install boostlib-all-dev ...

Boost Log - undefined reference to `boost::system::system_category()'
Пытаюсь скомпилировать код из примеров Boost Log:#include &lt;boost/log/trivial.hpp&gt; int main(int, char*) { ...

12
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
23.02.2014, 21:49
Вообще он и не должен быть быстрее. Во всяком случае, при таком использовании.
0
3 / 3 / 2
Регистрация: 28.09.2013
Сообщений: 32
23.02.2014, 21:52  [ТС]
А зачем он тогда нужен? И какие есть способы быстрого выделения памяти для stl контейнеров? (приближенное по скорости к .NET)
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
23.02.2014, 22:27
Цитата Сообщение от Surgery Посмотреть сообщение
И какие есть способы быстрого выделения памяти для stl контейнеров? (приближенное по скорости к .NET)
Я не знаю, каким образом контейнеры .NET управляют памятью, но подозреваю, что вряд ли быстрее, чем стандартные аллокаторы STL
Цитата Сообщение от Surgery Посмотреть сообщение
А зачем он тогда нужен?
Стандартные аллокаторы примитивны в способах управления памятью. Если им сказано "allocate", они выделяют память; сказано "deallocate" - освобождают. Каждый instance такого аллокатора ничего не знает об остальных, т.е. все они работают независимо друг от друга. И это правильный подход для общего решения.

Аллокаторы из Boost.Pool дают больше контроля над тем, как происходит управление памятью в приложении. В первую очередь такие аллокаторы стоит рассматривать в рамках embedded систем, либо (если говорить более обощенно) в рамках систем, которые потребляют действительно очень много памяти (близкое к максимуму).

Стандартный менеджер памяти для каждого выделенного блока памяти сохраняют некоторую служебную информацию (как минимум размер блока). Подобный "оверхэд" может быть критическим для некоторых систем. Опять же при большом количество аллокаций/деаллокаций имеет место фрагментация памяти. Boost.Pool с фрагментацией также справляется лучше.

Такие ситуации очень тяжело воспроизвести искусственно. А на дескопах вообще особого смысла в Boost.Pool (в плане скорости), как такового, нет.

Говорить тут можно долго и сложно, но лучше просто прочитать:
http://www.boost.org/doc/libs/... oling.html
http://www.boost.org/doc/libs/... tions.html

http://gee.cs.oswego.edu/dl/html/malloc.html
ftp://ftp.cs.utexas.edu/pub/garbage/allocsrv.ps
2
3 / 3 / 2
Регистрация: 28.09.2013
Сообщений: 32
24.02.2014, 01:34  [ТС]
Спасибо за развернутый ответ насчет boost.pool=) а насчет .NET, там такой вот код -
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        private static Random random = new Random((int)DateTime.Now.Ticks);
        private static string RandomString()
        {
            StringBuilder str = new StringBuilder(32);
            for (int i = 0; i < 32; i++)
                str.Append(Convert.ToChar(random.Next(97, 122)));
            return str.ToString();
        }
 
        static void Main(string[] args)
        {
            Dictionary<string, string> map = new Dictionary<string, string>();
            for (uint i = 0; i < 100000; i++)
            {
                map[RandomString()] = RandomString();
            }
            Console.WriteLine(map.Count);
            Console.ReadKey();
        }
- выполняется мгновенно (около 150ms), в то время как на C++ - порядка 6 секунд, что в 45 раз медленнее. Видимо, на C++ подобная скорость работы с памятью невозможна
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.02.2014, 14:19

Не по теме:

Цитата Сообщение от Surgery Посмотреть сообщение
идимо, на C++ подобная скорость работы с памятью невозможна
Если руки кривые то да...


Тут главный вопрос не можно/не можно, а то почему и как.

Добавлено через 12 минут
А причиной тому может быть то что:
1. Генератор строки в данной реализации в С++ медленнее работает.
2. Ты используешь хеширование в С++, а значит при в ставке еще и затраты на хеширование, которых предположу что нет в реализации на C#.
1
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
24.02.2014, 14:54
Surgery, в версии на С++ 99% времени тратится на генерацию строк, а не вставку в контейнер.

Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
не можно/не можно
Ох и долго ж я втыкал в эту фразу :D

0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.02.2014, 15:01
Цитата Сообщение от fasked Посмотреть сообщение
на С++ 99%
Стандарт ?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
24.02.2014, 15:15
Surgery, Вам вряд ли требуется распределение точное по вероятности, поэтому предлагаю попробовать такую функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
std::string get_rand_string()
{
    std::string str;
    str.reserve(32);
 
    std::default_random_engine generator;
    std::generate_n(std::back_inserter(str), 32, [&](){
        return static_cast<char>(generator() % (122 - 97) + 97);
    });
    
    return str;
}

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
Стандарт ?
А-то :ROFL:

1
3 / 3 / 2
Регистрация: 28.09.2013
Сообщений: 32
24.02.2014, 18:55  [ТС]
Да, спасибо, тупанул в сравнении, с вашим вариантом рандомной строки выполняется по скорости так же как в C#. А еще выяснилось что рандом в моем изначальном варианте работает примерно в 10 раз быстрее в linux(g++) чем в windows (MSVC)
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
24.02.2014, 19:59
Цитата Сообщение от Surgery Посмотреть сообщение
А еще выяснилось что рандом в моем изначальном варианте работает примерно в 10 раз быстрее в linux(g++) чем в windows (MSVC)
Сборка с оптимизациями или без?
0
3 / 3 / 2
Регистрация: 28.09.2013
Сообщений: 32
25.02.2014, 01:28  [ТС]
Да, в студии -O2, с gcc -O3

Добавлено через 4 часа 36 минут
А результат то с таким рандомом не верен - он всегда возвращает одну и ту же последовательность, поэтому строка всегда одинакова - в map вставляется лишь 1 элемент
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
25.02.2014, 09:35
Цитата Сообщение от Surgery Посмотреть сообщение
А результат то с таким рандомом не верен - он всегда возвращает одну и ту же последовательность, поэтому строка всегда одинакова - в map вставляется лишь 1 элемент
Уберите генератор в глобальные переменные
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.02.2014, 09:35
Помогаю со студенческими работами здесь

Использование boost и boost.build с несколькими компиляторами
Здравствуйте! Собрал библиотеку boost и boost.build для двух компиляторов: MinGW 4.5.2 и Visual C++ 2010 Express Edition. Для этого...

Метапрограммирование в boost::proto (boost::spirit)
В библиотеке boost:: proto есть такой код calculator&lt;proto::terminal&lt;placeholder&lt;0&gt; &gt;::type&gt; const _1; ...

Qt и boost boost::system::generic_category()
Добрый день Не подскажите как настроить Qt на работу с boost? У меня в принципе все работает: умные указатели и тд. Но когда...

boost::geometry::model::box и boost::geometry::area
Здравствуйте! Пытаюсь измерить площадь box'a :D, но не знаю как правильно это сделать. Вот этот код при компиляции выдает кучу ошибок: ...

Qt и boost
Как правильно прикрутить boost к Qt Creator? Можно ли использовать уже установленный boost для Visual Studio (через инсталятор)? Как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru