我们正在使用 boost 线程特定指针来仅为该特定线程存储一些全局数据。下面是当有人调用 GetInstance() 时我们返回的单例。
我的问题是,与普通指针访问相比,获取线程特定指针 (m_tspConnectionManager.get();) 大约需要多长时间?
我使用了下面的代码(我调用了 .get() 方法两次),完成整个函数大约需要 3 秒。
typedef boost::thread_specific_ptr<ConnectionManager> ConnMgrPtr;
static ConnMgrPtr m_tspConnectionManager;
static ConnectionManager* GetInstance()
{
if(!m_tspConnectionManager.get())
{
//first time called by this thread
//ConnectionManager* to be used in all subsequent calls from this thread
m_tspConnectionManager.reset(new ConnectionManager());
}
return m_tspConnectionManager.get();
}
现在,我将上面的代码更改为只调用一次 .get() 方法,它花费了大约 1.9 秒。
static ConnectionManager* GetInstance()
{
ConnectionManager* pConnMgr = m_tspConnectionManager.get();
if(pConnMgr == NULL)
{
//first time called by this thread
//ConnectionManager* to be used in all subsequent calls from this thread
m_tspConnectionManager.reset(new ConnectionManager());
}
return pConnMgr != NULL ? pConnMgr : m_tspConnectionManager.get();
}
所以,只要不调用 .get() 方法,我就能看到 1.1 秒的性能提升。我一直在试图了解我们如何获得 yield ? 注意:这个 yield 可能是多次调用GetInstance()函数的集体 yield 。只是想了解这里的单个通话增益。
最佳答案
get()
不太可能花费很多时间(当然,它比不调用 get()
慢)。 TLS,您的对象最多只有三个指针间接距离。 (线程 block 寄存器 -> TLS block -> 你的指针。)但是如果你调用 GetInstance()
的次数足够多,那么任何减速都可能变成一个很大的减速。
我会查看 GetInstance()
被调用的频率。尝试通过缓存返回的指针来减少该数字。当然,第二种实现优于第一种。
关于c++ - Boost Thread Specific 指针 get() 方法所花费的大概时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19725725/