我们正在使用提升线程特定指针来仅为该特定线程存储一些全局数据。下面是当有人调用 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 秒的性能提升。我一直在试图了解我们如何获得收益? 注意:这个收益可能是多次调用 GetInstance() 函数的集体收益。只是想在这里理解一个呼叫增益。