我目前正在使用Valgrind的“Callgrind”来分析具有性能问题的应用程序。在查看分析数据时,似乎在主要目的是物理模拟和可视化的应用程序中, boost::detail::get_tss_data
内部花费了25%的处理时间。
get_tss_data
显然是由 thread_specific_ptr::get
调用的
有没有人按预期看到这个?它通常意味着其他特定的东西吗?
修改:
我的平台是:Linux-2.6.32,x86,GCC 4.4.3,libc6-2.11.1 / libpthread-2.11.1
答案 0 :(得分:4)
thread_specific_ptr
对POSIX系统使用pthread_setspecific
/ pthread_getspecific
,这不是最快的。
如果您使用的是POSIX系统,则可以使用__thread
存储说明符。但是,它只能与具有常量表达式的初始值设定项一起使用,例如gcc's __thread
对于Windows,类似的说明符是_declspec(thread)
。
答案 1 :(得分:1)
获取线程本地数据很可能涉及系统调用。系统调用跳转到中断向量以及现在必须读取内核内存。所有这些都会杀死缓存。
因此,读取线程本地数据可能比正常变量读取长得多。出于这个原因,将线程本地数据缓存到一些局部变量并且不经常访问线程本地存储可能是一个好主意。