提升线程特定指针 get() 方法所花费的大致时间

Approximate time taken by Boost Thread Specific pointer get() method

本文关键字:时间 方法 线程 定指 指针 get      更新时间:2023-10-16

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

get()不太可能花费太多时间(当然,它比不调用get()要慢。使用 TLS 的"正常"实现,您的对象最多是三个指针间接寻址。(线程块寄存器 -> TLS 块 ->您的指针。但是,如果你打电话给GetInstance()足够多,那么任何放缓都可能变成一个很大的减速。

我会看看GetInstance()多久被打电话一次。尝试通过缓存返回的指针来减少该数字。当然,第二种实现比第一种实现更可取。