Boost Weak_Ptr:销毁比预期更昂贵

时间:2010-12-17 20:57:25

标签: c++ performance optimization boost

无论出于何种原因,我们都会从破坏弱指针中看到相当多的成本。这是罪魁祸首代码:

~weak_count() // nothrow  
{  
    if(pi_ != 0) pi_->weak_release();  // Consumes a huge chunk of our time.
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)  
    id_ = 0;  
#endif  
} 

我们没有处于调试模式,并且调试挂钩未启用。弱释放正在消耗真正惊人的时间。这是一个已知的问题?我们做错了吗?

提升版:1.36
编译器:VS2008编译器套件。

不幸的是,由于各种原因,我们被锁定在这个Boost版本中,所以我更想知道这些奇怪的支出是否可以在新版本上重复,或者代表已知不良做法的结果。我们只破坏了500k弱指针的顺序,它们不会因破坏相似数量的原始指针而在性能上产生明显的差异。当然不会增加2.5-4倍的成本。请注意,我们不会删除所述指针所针对的对象。这笔费用完全来自指针本身的销毁。

这里发生了什么?

2 个答案:

答案 0 :(得分:4)

weak_ptr需要像shared_ptr这样的东西来实现自己 - 因为它需要能够确定指针是否仍然存在,它需要在某处维护它自己的引用计数的引用计数结构

即,weak_ptr如何确定对象是否仍然存在,除非引用计数以某种方式保持可用以使其到达? :)

如果您不需要使用weak_ptr实际获取一段代码的所有权,那么您可以通过传递原始指针而不是weak_ptr来逃脱。

答案 1 :(得分:2)

最有可能的是,成本来自引用计数的原子减量,与整数分配相比,它相当昂贵,并且可能导致缓存(或非常极端,页面)未命中/错误,并且是原子操作,它也可能导致高速缓存行失效等事情。

然而,破坏原始指针是一种无操作,所以我不完全确定你对weak_ptr的期望是什么,但如果它提供任何类型的破坏语义,它在物理上不可能提供相同的破坏成本。

同样地,你可能会过度使用它们。所有权执行指针不是银弹 - 您仍然需要考虑谁拥有该对象。大量使用弱指针向我表明,你并没有真正考虑过你的所有权语义。

最后,在std :: tr1命名空间中,MSVC 2008中有一个shared_ptr和weak_ptr的实现。你可以试试。