1

我们正在使用提升线程特定指针来仅为该特定线程存储一些全局数据。下面是当有人调用 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() 函数的集体收益。只是想在这里理解一个呼叫增益。

4

1 回答 1

0

这不太可能get()花费很多时间(当然,它比 NOT call 慢get()。)使用 TLS 的“正常”实现,您的对象至多是三个指针间接距离。(线程块寄存器-> TLS 块-> 你的指针。)但是如果你调用GetInstance()的足够多,那么任何减速都可能成为一个很大的减速。

我会看看GetInstance()被调用的频率。尝试通过缓存返回的指针来减少该数字。当然,第二种实现方式优于第一种实现方式。

于 2013-11-01T12:43:44.040 回答