Подтвердить что ты не робот

Ожидается ли, что использование 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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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