Библиотека Boost

Программирование на C++

Переход с boost::unordered_map и boost::unordered_set на std::unordered_map и std::unordered_set

С того времени, как мы перешли на Visual C++ 2015, прошло больше года. До сих пор мы использовали  boost::unordered_map и boost::unordered_set, и они себя вполне хорошо зарекомендовали. Однако, наконец-то, дошли руки протестировать их реализацию из стандартной библиотеки нового компилятора.

Самый распространенный случай использования ключей для этих контейнеров в нашей системе — это либо std::string, либо какой-то интегральный тип, либо что-то, приводящее к нему (например, enum). При этом размеры контейнеров не очень большие, в пределах от единиц до нескольких десятков, реже сотен элементов. Сначала заполним элементы значениями, определим ключи так, чтобы был равномерный разброс по диапазону. Затем для выбранных ключей прогоним тест в цикле и измерим время. Как обычно, тесты делаем с использованием Boost.Test.

Теперь сделаем то же самое для интегральных типов.

Результат вывода теста:

Как видно, результат для std::unordered_set для данных условий отличается в лучшую сторону.

В тестах использован класс DateTime, использующийся в нашей кодовой базе, но это по сути boost::posix_time::ptime с набором дополнительных сервисных методов. OrderStateEnum — класс-обертка энумератора состояний ордеров, также использующийся в платформе. Для того, чтобы его можно было использовать в качестве ключа в unordered_set, необходимо переопределить оператор == и специализировать boost::hash_value() и std::hash.

Должен заметить, что тест может показать и другие результаты в иных условиях, например, про большом количестве элементов или при других типах ключей. Однако, это тестирование было проведено конкретно для нашего случая и показало хороший результат. Соответственно, мы пришли к выводу, что избавление от лишней зависимости в данном случае оправданно.

27 Мар 2017

Добавить комментарий

Для отправки комментария вы должны авторизоваться.

Инвестирование с QuantPro Platform

Оптимальное соотношение между доходностью и риском