Ожидается ли медленное использование boost :: thread_specific_ptr <> :: get ()? Любая работа вокруг? - PullRequest
13 голосов
/ 23 марта 2011

В настоящее время я профилирую приложение с проблемами производительности, используя Valgrind's Callgrind. При просмотре данных профилирования выясняется, что 25% времени обработки затрачивается на boost::detail::get_tss_data в приложении, основной целью которого является физическое моделирование и визуализация.

get_tss_data явно называется thread_specific_ptr::get

Кто-нибудь видит это как положено? Это вообще подразумевает что-то еще определенное?

Редактировать:

Моя платформа: Linux-2.6.32, x86, GCC 4.4.3, libc6-2.11.1 / libpthread-2.11.1

Ответы [ 2 ]

4 голосов
/ 23 марта 2011

thread_specific_ptr использует pthread_setspecific / pthread_getspecific для систем POSIX, что не является самым быстрым из возможных.

Если вы работаете в системе POSIX, вы можете использовать спецификатор хранения __thread. Однако его можно использовать только с инициализаторами, которые являются константными выражениями, например, __thread

.

Для Windows аналогичный спецификатор: _declspec(thread).

1 голос
/ 23 марта 2011

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

По этой причине чтение локальных данных потока может быть намного дольше, чем чтение обычной переменной. По этой причине вполне может быть хорошей идеей кешировать локальные данные потоков в некоторые локальные переменные и не делать частых обращений к локальным хранилищам потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...