Ожидается ли, что использование boost:: thread_specific_ptr <>:: get() будет медленным? Любая работа вокруг?
В настоящее время я профилирую приложение с проблемами производительности, используя Valgrind "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
Ответы
Ответ 1
thread_specific_ptr
использует pthread_setspecific
/pthread_getspecific
для систем POSIX, которые не являются максимально возможными.
Если вы находитесь в системе POSIX, вы можете использовать спецификатор хранилища __thread
. Однако его можно использовать только с инициализаторами, которые являются постоянными выражениями, например gcc __thread
Для Windows аналогичный спецификатор _declspec(thread)
.
Ответ 2
Получение локальных данных потока, скорее всего, будет связано с системным вызовом. Системные вызовы переходят к вектору прерывания, а теперь читают память ядра. Все это убивает кеш.
По этой причине чтение локальных данных потока может намного дольше, чем чтение обычной переменной. По этой причине вполне может быть хорошей идеей кэшировать локальные данные потока локальной локалью, а не делать частые обращения к локальному хранилищу потоков.