[C++] C++11 vs Boost

erotic

С приходом нового стандарта многие фичи, которые раньше жили в Boost, стали доступными в C++11. Естественно, есть желание использовать именно их, т.к. они "стандартные" и не требуют внешних библиотек (Boost). Но в связи с этим возникает множество проблем:
1. Классы std и классы boost - разные классы, и если новая часть кода использует std::shared_ptr, а старая - boost::shared_ptr - вы не сможете взаимодействовать между ними.
2. Не все, что есть в Boost, поддерживается в std в полной мере, скажем std::regex я так и не смог завести, поэтому продолжил использовать boost::regex.
3. Некоторые классы имеют различное поведение в std и в boost, например, boost::ref(boost::ref(x создает ссылку на ссылку (причем временную в то время как std::ref(std::ref(x корректно обрабатывает такой вызов и возвращает одну ссылку на x.
4. Новые фичи появляются и будут появляться в Boost, но не будут или будут медленнее или в виде расширений в std. Например, в boost-1.50 появились атрибуты потоков, позволяющие задавать как минимум размер стека создаваемого потока. Когда это будет в C++11? Хз.
5. Библиотеки в std и boost имеют иногда разную производительность. Вот, например, заполнение unordered_set миллионом чисел в порядке линейного возрастания, убывания и рандома:

vedroid ~/programming/tests/boost_vs_std
> g++ unordered_map.cpp -std=c++0x -l rt -O3
vedroid ~/programming/tests/boost_vs_std
> ./a.out
11692741 linear_asc boost::unordered_set<int64_t>
8862415 linear_asc std::unordered_set<int64_t>
5690124 linear_desc boost::unordered_set<int64_t>
3571929 linear_desc std::unordered_set<int64_t>
7064782 random boost::unordered_set<int64_t>
6636689 random std::unordered_set<int64_t>

Хотелось бы узнать, есть ли у форумчан подобные проблемы и как они их решают. Для себя пока вижу один путь - во внутрях использовать что угодно, интерфейсы иметь на boost'е.

Maurog

у меня подобных проблем нет, так как я настолько суров, что мне не дают буст :grin:
тут еще важным моментом является кроссплатформенность std-кода (гцц и студия сейчас поддерживают разные фичи свежего стандарта)
но я так понимаю, что такая кросс-платформенность вам не нужна, вы сидите жестко на гцц
в этом случае я бы рекомендовал двигаться навстречу гцц и использовать именно его по возможности
во-первых, гцц наверняка слизывает код у буста, параллельно его улучшая
во-вторых, гцц поддерживает довольно широко свежий стандарт
в-третьих, замеченные баги можно репортить и потихоньку апгрейдить гцц, это положительно скажется на скорости развития гцц и его качестве
std::ref и std::unordered_set уже улучшены, судя по вашему анализу

istran

Сталкивался только с разным поведением деструкторов у boost::thread и std::thread, но это было некритично.
Я кстати не очень понимаю, как упорядоченность входных данных может влиять на скорость insert-а в unordered_set. Хэш функция ведь должна равномерно ключи размазывать, так что порядок в среднем влиять не должен.

apl13

В-четвертых, TR2 еще не стал стандартом же, нет?

Maurog

В-четвертых
проблема в ассоциативном мышлении :confused:
tr2 не попал в стандарт и, самое оптимистичное, попадет лишь к 2017 году. более реально к 2022 году ( http://www.rsdn.ru/forum/cpp/4624970.all.aspx )
tr2 есть в бусте, его имеет смысл использовать для этого

erotic

Хэш функция ведь должна равномерно ключи размазывать, так что порядок в среднем влиять не должен.
std::hash от числа возвращает само число. Дальше я пока не думал.

evgen5555

Разница в производительности какая-то неубедительная
Не пробовал размер в конструкторе указать, чтобы rehash-ить поменьше?

erotic

Это же разные тесты получаются, по-моему мерять с рехешами честно. Но вот:

> ./a.out
11741389 linear_asc boost::unordered_set<int64_t>
9245805 linear_asc boost::unordered_set<int64_t> preallocated
7230711 linear_asc std::unordered_set<int64_t>
4984042 linear_asc std::unordered_set<int64_t> preallocated

10973607 linear_desc boost::unordered_set<int64_t>
7543692 linear_desc boost::unordered_set<int64_t> preallocated
7168366 linear_desc std::unordered_set<int64_t>
4947749 linear_desc std::unordered_set<int64_t> preallocated

12265075 random boost::unordered_set<int64_t>
8780578 random boost::unordered_set<int64_t> preallocated
13260713 random std::unordered_set<int64_t>
7872358 random std::unordered_set<int64_t> preallocated

Разница только в том, что std в random perallocated лучше, чем boost, остальной расклад такой же.
Вот почему обратный порядок заполнения лучше, не пойму. В std видимо дело в переаллокациях, т.е. преаллоцированные версии одинаковы по времени.
Собсно, мы глубоко отклонились от темы :)
Оставить комментарий
Имя или ник:
Комментарий: