C++ Boost线程特定指针get()方法所用的大致时间

C++ Boost线程特定指针get()方法所用的大致时间,c++,windows,multithreading,performance,thread-local-storage,C++,Windows,Multithreading,Performance,Thread Local Storage,我们使用特定于boost线程的指针来存储特定线程的一些全局数据。下面是当有人调用GetInstance时我们返回的单例 我的问题是获取特定于线程的指针m_tspConnectionManager.get大约需要多长时间;与普通指针访问相比 我在调用.get方法的地方使用了下面的代码两次,完成整个函数大约需要3秒钟 typedef boost::thread_specific_ptr<ConnectionManager> ConnMgrPtr; static ConnMgr

我们使用特定于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.1秒的性能提升。我一直在试图了解我们是如何获得收益的? 注意:此增益可能是多次调用GetInstance函数的集体增益。只是想了解一下这里的单个调用增益。

get不太可能花费很多时间,当然,它比不调用get要慢。在TLS的正常实现中,对象最多有三个指针间接指向。线程块寄存器->TLS块->指针。但如果您调用GetInstance的次数足够多,那么任何减速都可能成为一次大减速


我将查看调用GetInstance的频率。尝试通过缓存返回的指针来减少该数字。当然,第二种实现比第一种实现更可取。

绝对不可能执行特定于线程的\u ptr::get需要1.1秒。甚至在调试模式下。您是如何对这些事情进行计时的?对不起,我没有正确说明,但1.1秒是集体增益,即多次调用函数。我只想了解一下单次呼叫的大致增益。
    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();
            }