| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > boost::call_once нужны добровольцы :) |
| Автор: SABROG 8.6.2010, 00:09 | ||
Может кто-нибудь выложить результаты теста вызова функции boost::call_once 1000 * 1000 * 1000 раз. То есть в цикле как обычно:
Интересует за сколько по времени выполнится этот цикл в release сборке. Это должно занять меньше минуты. |
| Автор: boostcoder 8.6.2010, 00:31 |
| а в чем собственно проблема? |
| Автор: SABROG 8.6.2010, 00:36 | ||
Хочу понять есть ли разница в скорости между std::call_once и boost::call_once. |
| Автор: boostcoder 8.6.2010, 00:40 |
| т.е. у вас нет буста? сейчас.. |
| Автор: boostcoder 8.6.2010, 01:02 | ||||||||
amd phenom 2.33 Добавлено через 2 минуты и 38 секунд не понятно почему бустовская версия такая тормознутая, в отличии от стандартной Добавлено через 13 минут и 53 секунды теперь понятно бустовская версия:
стандартная:
нужно почитать что по той ссылке такого умного написано, раз уж такой тормоз получился Добавлено через 14 минут и 36 секунд ах да, проверял на линукс. |
| Автор: SABROG 8.6.2010, 01:18 |
| Вообще результаты интересные. Дело в том, что автор алгоритма, который должен использоваться в std::call_once утверждает, что скорость "холостого" хода (после первого вызова функции) должна быть 1 миллиард в секунду. Но там была реализация только для pthreads, но на деле это не должно ничего менять, так как ОС зависимые функции не вызываются при холостом ходе. Значит на деле скорость в 9 раз медленней для std::call_once и в 25 раз медленней для boost. По крайней мере я немного успокоился так как моя версия call_once написанная на Qt тоже выполняется 25 секунд (под Windows). А алгоритм почти тот же что и в бусте, разве что классы Qt'шные. Это примерно 40 000 000 вызовов в секунду вместо 1 миллиарда. |
| Автор: boostcoder 8.6.2010, 01:23 |
| не понимаю, для чего эту функцию так часто вызывать? она ведь используется, в основном, при создании/инициализации некоторого ресурса. неужели, есть реальная надобность ее так часто дергать? |
| Автор: SABROG 8.6.2010, 01:28 |
| Она используется в некоторых версиях синглтонов внутри метода instance(), а уж на сколько часто будет вызываться этот синглтон зависит от разработчика. У меня например сейчас такая ситуация, что я не могу выставить приоритет потоку пока его не создаст библиотечный класс и пока я физически не попаду в функцию, которая будет выполняться в отдельном потоке. Но так как функция вызывается много раз, то выставлять приоритет потока на каждый вызов/итерацию слишком накладно, тут мне поможет функция call_once. Но .та функция есть пока только в boost, а в std::call_once она идет вместе с новым стандартом C++0x. В общем пришлось писать свою версию на Qt, так как там тоже аналогов нет несмотря на то, что Thiago Maciera обещал написать Q_ONCE еще пару лет назад. |
| Автор: boostcoder 8.6.2010, 01:37 |
ну так пользуйте. компилятор давно зарелизили. я постоянно тещу новые снепшоты. кстати, в релизе 4.5.0 есть баг, который проявляется при сборке openssl 0.9.8m и выше) http://forum.try-catch.ru/index.php?topic=205.0 в теме, есть ссылка на мингв на базе 4.6.0. Добавлено через 1 минуту и 44 секунды да, по бинарникам, он не совместим c Qt-libraries и Qt-sdk. придется пересобирать. |
| Автор: SABROG 8.6.2010, 10:43 | ||
| Спасибо за ссылку, буду на досуге пересобирать. На линуксе Qt версия не намного отличается от виндовой 21-24сек. Поставил на работе под linux boost 1.40.0, скорость при оптимизации -O3 такая же как и у Qt варианта - 21 сек. Intel® Pentium® Dual CPU E2200 @ 2.20GHz Intel® Core™2 Duo E6400 @ 2.13GHz --- Вот код из gcc 4.4.0 для винды:
--- К сожалению с новым MinGW больше проблем. Qt не собирается с версией OpenSSL, которая там идет. Пришлось выковыривать его оттуда и прописывать переменную LPATH вместо LIBRARY_PATH, которая почему-то стала игнорироваться линкером (g++ -print-search-dirs) и вскрылся баг с ""error: '_clear87' was not declared in this scope"", причем как выяснилось баг разработчиков MinGW (решается копированием файлов float.h и stddef.h в $QTDIR/include, только float.h там 2, нужно выбирать тот, что пожирнее). |