提升线程特定指针 get() 方法所花费的大致时间
Approximate time taken by Boost Thread Specific pointer get() method
我们使用特定于 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()
多久被打电话一次。尝试通过缓存返回的指针来减少该数字。当然,第二种实现比第一种实现更可取。
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 将时间戳打印到流的最简单方法
- 通常使用什么方法来检测时间情况?
- 在C++中执行 N 阶乘编译时间的 3 种不同/相同方法
- 有没有更准确的方法来记录C++时间?
- 在给定程序中降低矢量数组实现堆栈的时间复杂度有哪些不同的可能方法?
- 更好的单元测试方法,花费的时间太长
- 替换枚举以最大化编译时间检查的最佳方法
- 如何在长时间运行的方法中等待信号?
- 使用 GetLastError() 的真正正确的方法(时间)是什么?
- 为什么以相同的数量插入到集合中,基于不同的方法具有不同的运行时间?
- C 类方法的执行时间取决于什么
- 扩展中的日期时间对象方法C++问题
- 一定时间后强制终止方法
- 此插入方法的时间和空间复杂性
- 如何恢复注册表项的所有元素?(上次写入时间,类型,值,名称...这是正确的方法吗?
- 查找系统调用需要多长时间的可能方法
- 在 C++11 中表示日内时间 HH:MM:SS 的最佳方法是什么?
- C 编译时间检查模板类型中是否存在方法