`
qepwqnp
  • 浏览: 108873 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

boost::shared_ptr的性能

阅读更多

原文出版:http://www.darkbull.net/

在最近的项目中,使用了大量的boost::shared_ptr。在游戏服务器中,有时候同一数据块要发送给不同的连接(例如A玩家的一个行走消息包要发给所有附近的玩家),如果为每个连接都拷贝一份数据,显的代价比较大且难以维护,想想发送完数据之后还要释放这些数据块,极易出错,而且性能也不佳。使用智能指针,只需要一份数据块的拷贝,并且不需要去管理内存的释放。但这几天,我又在想,boost::shared_ptr号称是线程安全的,那么在低层维护对象的引用计数时,必定有加琐/解琐。如果频繁的对智能指针进行复制,性能开销也不能忽略。我现在对boost的线程库使用还不是很熟练,网上查了一下,shared_ptr好像是通过Boost.Thread的mutex对象来保护引用计数,如果真是这样,那么我推断:在windows上使用shared_ptr,性能肯定没有直接使用windows api来进行同步的智能指针性能高。基于这样的猜测,我自己写了一些简单的智能指针,通过windows api Interlocked系列函数来维护智能指针引用计数。大概代码如下:

#ifndef AUTOPTR_H_INCLUDED
#define AUTOPTR_H_INCLUDED

#include <windows.h>

template<typename T>
class AutoPtr
{
public:
    AutoPtr(void)
        : _ptr(0), _refCount(0)
    { }

    explicit AutoPtr(T *ptr)
        : _ptr(ptr)
    {
        _refCount = new long(1);
    }

    AutoPtr(const AutoPtr &rhs)
        : _ptr(rhs._ptr), _refCount(rhs._refCount)
    {
        if (_ptr && _refCount)
            ::InterlockedIncrement(_refCount);  // 引用计数加1
    }

    ~AutoPtr(void)
    {
        if (!_ptr)
            return;

        long refCount = ::InterlockedExchangeAdd(_refCount, -1);
        if (refCount == 1)
        {
            delete _refCount;
            delete _ptr;
        }
    }

    T &operator*(void)
    {
        return *_ptr;
    }

    const T&operator*(void) const
    {
        return *_ptr;
    }

    T *operator->(void)
    {
        return _ptr;
    }

    const T*operator->(void) const
    {
        return _ptr;
    }

    const AutoPtr &operator=(const AutoPtr &rhs);

//    T *get(void)
//    {
//        return _ptr;
//    }
//
//    const T *get(void) const
//    {
//        return _ptr;
//    }
//
//    T *release(void)
//    {
//
//    }
//
//    void reset(T *ptr)
//    {
//
//    }

private:
    T *_ptr;
    long *_refCount;
};

template<typename T>
const AutoPtr<T> &AutoPtr<T>::operator=(const AutoPtr &rhs)
{
    if (_ptr)
    {
        long refCount = ::InterlockedExchangeAdd(_refCount, -1);
        if (refCount == 1)
        {
            delete _refCount;
            delete _ptr;
        }
    }

    _ptr = rhs._ptr;
    _refCount = rhs._refCount;
    if (_refCount)
        ::InterlockedIncrement(_refCount);

    return *this;
}

#endif // AUTOPTR_H_INCLUDED

并写了一个简单的测试程序,用来对比自己写的AutoPtr,boost::shared_ptr,std::tr1::shared_ptr。测试代码如下:

int main(int argc, char *argv[])
{
	AutoPtr<int> intPtr1(new int(0));
    time_t beg1 = clock();
    for (int i = 0; i < 10000000; ++i)
    {
        AutoPtr<int> tmp = intPtr1;
        ++(*tmp);
    }
    time_t end1 = clock();
	std::cout << "AutoPtr cost: " << end1 - beg1 << ", Result: " << *intPtr1 << std::endl;

	boost::shared_ptr<int> intPtr2(new int(0));
	time_t beg2 = clock();
	for (int i = 0; i < 10000000; ++i)
	{
		 boost::shared_ptr<int> tmp = intPtr2;
		 ++(*tmp);
	}
	time_t end2 = clock();
	std::cout << "boost::shared_ptr cost:" << end2 - beg2 << ", Result: " << *intPtr2 << std::endl;

	std::tr1::shared_ptr<int> intPtr3(new int(0));
	time_t beg3 = clock();
	for (int i = 0; i < 10000000; ++i)
	{
		std::tr1::shared_ptr<int> tmp = intPtr3;
		 ++(*tmp);
	}
	time_t end3 = clock();
	std::cout << "std::tr1::shared_ptr cost:" << end3 - beg3 << ", Result: " << *intPtr3 << std::endl;

	return 0;
}

结果出乎我的意料:

在VC9下的结果为:

VC9 Release结果

在gcc4.4.2下的结果:

gcc4.4.2 Release结果

结果表明,boost:;shared_ptr的性能并没有我想像是的那么差,在vc9下,三种智能指针的性能在同一水平上;而在gcc4.4.2下,boost::shared_ptr与AutoPtr性能相近,但与tr1版本的shared_ptr相差一个数量级。

分享到:
评论

相关推荐

    C++11 下使用 Boost.Serialization 库实现智能指针的序列化

    例如,你可以创建一个`serialize`模板函数,接受一个`std::shared_ptr`或`std::unique_ptr`作为参数,并使用Boost.Serialization库进行处理。 最后,`shared_ptr.hpp`和`unique_ptr.hpp`可能是包含这些辅助类和函数...

    浅析Boost智能指针:scoped_ptr shared_ptr weak_ptr

    【Boost智能指针详解:scoped_ptr、shared_ptr与weak_ptr】 智能指针是C++中用来自动管理动态分配内存的对象,它可以确保在适当的时间释放内存,以防止内存泄漏。Boost库提供了一组智能指针类型,包括scoped_ptr、...

    shared_ptr只能对new的内存操作

    在C++标准库中,`std::shared_ptr`(在早期版本中可能使用`boost::shared_ptr`)是一种智能指针,它通过引用计数来管理动态分配的对象生命周期。`std::shared_ptr`的设计目的是自动管理对象的内存,当最后一个指向该...

    shared_from_this() in Constructor:直接替换std :: shared_ptr + std :: enable_shared_from_this-开源

    显然,许多人不喜欢标准std :: enable_... boost库也可以这样做,但是它不允许在析构函数中创建shared_ptrs,并且它不提供release()方法来获取所包含指针的所有权。 但是,不利的一面是,它还没有成为线程安全的。

    shared_ptr

    在智能指针家族中,`shared_ptr`和`weak_ptr`是TR1(Technical Report 1)的一部分,也被称为Boost库的一部分,并被整合到了C++11标准中。 ### shared_ptr `shared_ptr`是一种引用计数智能指针,当一个`shared_ptr...

    一个最小的sharedunique_ptr实现来处理booststdsharedunique_ptr不可用的情况。.zip

    在某些情况下,可能由于库的限制或者特定环境不支持Boost或C++11及更高版本,导致无法使用标准库中的`std::shared_ptr`和`std::unique_ptr`。在这种场景下,就需要实现自己的智能指针,以达到类似的效果。标题所提及...

    C++ 中boost::share_ptr智能指针的使用方法

    使用 boost::shared_ptr 智能指针需要首先编译 Boost 库,然后在代码中包含头文件 &lt;boost/shared_ptr.hpp&gt;。 1. 创建智能指针 使用 boost::shared_ptr 智能指针可以创建一个对象,例如: ```cpp boost::shared_ptr...

    shared_ptr线程安全性全面分析

    shared_ptr的线程安全性boost官方文档对shared_ptr线程安全性的正式表述是:shared_ptr对象提供与内置类型相同级别的线程安全性。【shared_ptrobjects offer the same level of thread safety as built-in types.】...

    boost_1_53_0.tar.gz

    其次,Boost库中的智能指针(如boost::shared_ptr和boost::unique_ptr)在C++11标准中被采纳,成为std::shared_ptr和std::unique_ptr。这些智能指针管理对象生命周期,避免内存泄漏,提高了代码的安全性。在boost_1_...

    boost_1_44_0

    1. **智能指针**:如`shared_ptr`、`weak_ptr`和`unique_ptr`,这些智能指针类提供了自动内存管理,避免了传统指针可能导致的内存泄漏问题。 2. **多态函数对象**:如`function`和`bind`,它们允许将函数、成员函数...

    boost_1_59_0.tar.gz

    2. **智能指针(Boost.smart_ptr)**:如`shared_ptr`, `unique_ptr`等,这些智能指针帮助开发者更好地管理内存,防止内存泄漏。 3. **正则表达式库(Boost.Regex)**:提供了比标准库更强大的正则表达式处理能力。 4. *...

    提升2:shared_ptr包装资源句柄

    - 在C++11之前,Boost提供了`shared_ptr`的实现,它在功能和行为上与C++11及更高版本的`std::shared_ptr`相似。 - Boost库的`shared_ptr`可以方便地在旧版本的编译器中使用,例如VC6,提供智能指针的功能。 5. **...

    SmartPointer.zip

    `shared_ptr`是C++11标准之前 Boost 提供的一种智能指针,它采用了引用计数的方式来管理对象的生命周期。当一个`shared_ptr`被创建时,它会增加目标对象的引用计数;当`shared_ptr`被销毁或者赋值给其他`shared_ptr`...

    boost_1_60_0.tar.gz

    1. **智能指针**:Boost提供了一套完整的智能指针解决方案,如`boost::shared_ptr`、`boost::weak_ptr`和`boost::unique_ptr`,它们可以有效管理对象生命周期,避免内存泄漏。 2. **多线程支持**:Boost.Thread库...

    boost_1_68_0.7z

    Boost.Smart Ptr是C++中智能指针的实现,包括shared_ptr、unique_ptr和weak_ptr等。这些智能指针在C++11标准中被采纳,它们解决了原始指针可能导致的内存泄漏问题。shared_ptr实现了引用计数,使得多个指针可以共享...

    Boost智能指针

    boost::shared_ptr&lt;test&gt; ptr_2 = ptr_1; ptr_2-&gt;print(); // 引用计数为2 ptr_1-&gt;print(); // 引用计数仍然为2 return 0; } ``` 3. **`intrusive_ptr&lt;T&gt;`** - **定义**:`intrusive_ptr`类似于`shared_ptr`...

Global site tag (gtag.js) - Google Analytics