Впрочем оно и так не было быстрее прямого создания в векторе :) Если ещё покажете как можно такой же фокус проделать с указателями, вообще перевернете мои представление о бытии :))
P.S. Просто брать указатель на только что добавленый через emplace_back объект нельзя, ибо если вектор содержащий объект, куда то скопировать/переместить — указатель будет валидным лишь для источника, что естественно.
Насчет прогрева — в моём понимании reserve именно и должен был выполнить «прогрев». Попробовал ваш код. Получил несколько более медленное заполнение с пулом чем с emplace_back (порядка 5% разницы). Но вот при повторном проходе удивился — с пулом НЕ стало быстрее. Причина тому, то что при get() — пул инициализирует объект вызывая конструктор. Попробовал сравнивать emplace_back() и getRaw() — пул так же не выигрывает в скорости по сравнению с прямой emplace_back. Этого я уже объяснить не могу, учитывая тот факт что new в лоб явно не быстрее изъятия из пула.
Чем по вашему вызван подобный «прогрев», имею ввиду при повторном проходе? Ведь мы зарезервировали память изначально с reserve.
Спасибо — буду знать.
Могу выложить qt проект — потестируете.
Мне же Буст встраивать в целевой проэкт не представляется возможным :) Хотел ptr_vector из библиотеки только вырвать — так там туча зависимостей. На этом моё знакомство с бустом закончилось :).
Про локи первый раз слышу :) (ну может второй)
Не равно. vector перемещает массив каждый раз при увеличении. Потому если заранее известен размер — имеет смысл reserve. Если все правильно то благодаря reserve перемещения массива можно избежать вообще.
Попробуйте убрать emplace_back и поймете в чем дело :)
resize() — всего лишь выделяет память. Но не создает новый объект.
Собственно объект создает (и добавляет элемент, и увеличивает size() ) — emplace_back/push_back
Мне почему то всегда казалось, что std::deque — это двухсвязаный список, тоесть есть издержки и на добавление и на поиск. Но перечитав документацию на него понял что ошибался.
Тем не менее — только что проверил — быстрее не оказалось:
P.S. Просто брать указатель на только что добавленый через emplace_back объект нельзя, ибо если вектор содержащий объект, куда то скопировать/переместить — указатель будет валидным лишь для источника, что естественно.
Здесь для чистоты эксперимента, раз уж мы «прогреваемся» следует и std::vector< BaseClass* > ptr_ar; вынести:
Пул от того выигрывать не станет, но по крайне мере проигрывает не так сильно :)
Чем по вашему вызван подобный «прогрев», имею ввиду при повторном проходе? Ведь мы зарезервировали память изначально с reserve.
Могу выложить qt проект — потестируете.
Мне же Буст встраивать в целевой проэкт не представляется возможным :) Хотел ptr_vector из библиотеки только вырвать — так там туча зависимостей. На этом моё знакомство с бустом закончилось :).
Про локи первый раз слышу :) (ну может второй)
Как ни странно — скорость выполнения все ещё ниже чем предложенным в статье способом.
resize() — всего лишь выделяет память. Но не создает новый объект.
Собственно объект создает (и добавляет элемент, и увеличивает size() ) — emplace_back/push_back
Тем не менее — только что проверил — быстрее не оказалось:
Результаты (с декой — 5й):
1: 94
2: 64
3: 35
4: 140
5: 99