对象池 和 支持对象池的shared_ptr
性能测试
数字的单位是微妙 分配5万个 1kb的object
10 kb
100kb
500b
128b
因此 只考虑对象分配速度问题的话 大于 512的对象推荐使用pool版本
第一个是:自己实现的池容器 对象池
第二个是:make_shared 非对象池
第三个是:原始的new delete 非对象池
测试2:
和上上面的一样 只不过第一条数据是 std::queue 而非自己实现的容器
对于release 0x3优化 版本的测试 相差很大
32bytes
64bytes
128 bytes
512
10kb
因此综合来看 超过 32 字节的 都应该用pool来处理
Object.h
#pragma once
/*
Email me@dreamyouxi.com
注意事项:
1.使用例子在cpp文件各种test函数里面
2.
class说明:
RawObject:
1.最原始的指针 只不过封装了一个release函数 用于delete this
RefObject:
1.简单的引用计数 需要手动去计数 Retain Release快速简单
RefObjectThreadSafe:
1.RefObject的线程安全版本 只保证计数安全
SharedObject:
1.std::enable_shared_from_this 封装 无需手动在继承 如果想用原始的std::shared_ptr可以继承方便使用
Recycleable:
1.对象池可回收对象 ctor和dtor需要重写 以供初始化内部数据
share_ptr:
1.ShareObjectPool 专有的指针类型 内部封装了std::shared_ptr,必需配合ShareObjectPool 使用
对象池:
ObjectPool :
1.64字节以上的class 都应该使用pool
2.对象池管理的对象必需是 RawObjectRecycleable OR RefObjectRecycleable OR Recycleable(需要手动调用ObjectPool::Release) 的子类
3.对于子类来说必需提供默认无参数构造函数public,对于构造方法请用其他方法(ctor or other member function)实现 而非依托于构造函数
ShareObjectPool:
1.64字节以上的class 都应该使用pool
2.该对象池相比ObjectPool 是share_ptr的专有对象池 利用share_ptr来管理对象的生命周期
3.管理的对象必需是 ShareObjectRecycleable 的子类
4.对于子类来说必需提供默认无参数构造函数public,对于构造方法请用其他方法(ctor or other member function)实现 而非依托于构造函数
TODO:
1.考虑是否不让new跑出异常而继续程序运行 new(std::nothrow)XX;
*/
#include <memory>
#include <atomic>
#include <mutex>
class Object
{
public:
};
//raw pointer object
class RawObject
{
public:
/**
* @brief call this to delete object
*/
inline virtual void Release()
{
delete this;
}
virtual ~RawObject()
{
}
};
//reference counter object
//this class is none-thread-safe, thread-safe replacer is (std::shared_ptr) or RefObjectThreadSafe
class RefObject
{
protected:
int referenct_count = 1;
public:
/**
* @brief add reference count
*/
inline void Retain()
{
++referenct_count;
}
/**
* @brief reduce reference count
*/
inline virtual void Release()
{
--referenct_count;
if (referenct_count <= 0)
{
delete this;
}
}
inline int GetReferenceCount()const
{
return referenct_count;
}
virtual ~RefObject()
{
}
//TODO add this to auto release pool or add std::shared_ptr suport
};
//reference counter object
class RefObjectThreadSafe
{
protected:
std::atomic<int> referenct_count = 1;
public:
/**
* @brief add reference count
*/
inline void Retain()
{
++referenct_count;
}
/**
* @brief reduce reference count
*/
inline virtual void Release()
{
--referenct_count;
if (referenct_count == 0)
{
delete this;
}
}
inline int GetReferenceCount()const
{
return referenct_count;
}
virtual ~RefObjectThreadSafe()
{
}
//TODO add this to auto release pool or add std::shared_ptr suport
};
//raw share ptr wrapper class
//create by std::make_shared ,pass object by share_from_this or std::shared_ptr's method
template<typename SubClassType>
class SharedObject :public std::enable_shared_from_this<SubClassType>
{
public:
virtual ~SharedObject()
{
}
//xxx->share_from_this();
};
//for object pool
class Recycleable
{
public:
/**
* @brief when re-use this class this will be call
*/
virtual void ctor() = 0;
/**
* @brief when recycle by pool this will be call
*/
virtual void dtor() = 0;
//tag for class ObjectPool
//泛型约束
inline void ___type_sub_class_restrain__FOR_ObjectPool()
{
}
};
class NoneRecycleable
{
public:
void ctor() = delete;
void dtor() = delete;
};
template< class T, bool ThreadSafe>
class share_ptr;
//对象>=该大小时才会使用Pool 否则Pool会动态new 和delete
#define OBJECT_POOL_MIN_SIZEOF 32
//40KB 1w objects
#define OBJECT_POOL_MAX_SIZE 10240
//1Kb 为对象池 预分配的 队列空间 的个数大小
#define OBJECT_POOL_DEFAULT_ALLOC_SIZE 512
//对象池预分配对象大小 必需小于 OBJECT_POOL_DEFAULT_ALLOC_SIZE
#define OBJECT_POOL_DEFAULT_ALLOC_OBJECT_SIZE 256
template< typename ClassType, typename bool ThreadSafe = false>
class ObjectPool
{
template< class ClassType, bool ThreadSafe = false>
class Ctor
{
public:
Ctor()
{//ctor
int capacity = ObjectPool<ClassType, ThreadSafe>::capacity;
auto pool = ObjectPool<ClassType, ThreadSafe>::_pool;
for (int i = 0; i < capacity; i++)
{
pool[i] = nullptr;
}
}
~Ctor()
{//dtor
ObjectPool<ClassType, ThreadSafe>::Clear();
//如果编译报错 那么证明不是约束下的 子类关系 请确认
ClassType * s = nullptr;
s->___type_sub_class_restrain__FOR_ObjectPool();
}
};
ObjectPool();
static int capacity;
static ClassType** _pool;
static int size;
static std::mutex _mutex;
private:
/**
* @brief resize inner pool growing by twice
* @warning this will copy old block and delete old
*/
static void ReSize()
{
auto pool = new ClassType*[capacity * 2];//
memset(pool, 0, sizeof(ClassType*)* 2 * capacity);
memcpy(pool, _pool, sizeof(ClassType*)* capacity);
capacity *= 2;
delete _pool;
_pool = pool;
}
static void PreAlloc()
{
auto pool = _pool;
for (int i = 0; i < OBJECT_POOL_DEFAULT_ALLOC_OBJECT_SIZE; i++)
{
pool[size] = new ClassType();
++size;
}
}
public:
/**
* @brief call this to new class who is the sub-class of Recycleable
* @note if class size if smaller than OBJECT_POOL_MIN_SIZEOF will new otherwise will gen object from pool
*/
static ClassType* Create()
{
if (ThreadSafe)
{
ClassType * ret = nullptr;
{
std::lock_guard<std::mutex> locker(_mutex);
static ObjectPool<ClassType, ThreadSafe>::Ctor<ClassType, ThreadSafe> ctor;//c11 compiler suport thread-safe
if (size > 0 && sizeof(ClassType) >= OBJECT_POOL_MIN_SIZEOF)
{
--size;
ret = (_pool[size]);
_pool[size] = nullptr;
}
}
if (!ret)
{
ret = new ClassType();
}
ret->ctor();
return ret;
}
else
{
//ctor之所以弄为函数的static是因为全局的static析构并不完全和定义顺序一致 因为为了避免不同编译器下出错就放在这里了
//局部的肯定比全局的先析构
static ObjectPool<ClassType, ThreadSafe>::Ctor<ClassType, ThreadSafe> ctor;//c11 compiler suport thread-safe
if (size > 0 && sizeof(ClassType) >= OBJECT_POOL_MIN_SIZEOF)
{
--size;
ClassType* ret = (_pool[size]);
_pool[size] = nullptr;
ret->ctor();
return ret;
}
auto ret = new ClassType();
ret->ctor();
return ret;
}
}
/**
* @brief release object to the pool
* @note if sizeof class is smaller than OBJECT_POOL_MIN_SIZEOF will delete now otherwise will put into pool
*/
static void Release(ClassType* who)
{
if (!who)return;
who->dtor();
if (sizeof(ClassType) < OBJECT_POOL_MIN_SIZEOF)
{
delete who;
return;
}
if (ThreadSafe)
{
std::lock_guard<std::mutex> locker(_mutex);
if (size >= OBJECT_POOL_MAX_SIZE)
{
cout << capacity << " " << typeid(ObjectPool<ClassType, ThreadSafe>).name() << " warnning Release out-of-size" << endl;
delete who;
return;
}
if (size >= capacity)
{
ReSize();
}
_pool[size] = who;
++size;
}
else
{
if (size >= OBJECT_POOL_MAX_SIZE)
{
cout << capacity << " " << typeid(ObjectPool<ClassType, ThreadSafe>).name() << " warnning Release out-of-size" << endl;
delete who;
return;
}
if (size >= capacity)
{
ReSize();
}
_pool[size] = who;
++size;
}
}
/**
* @brief delete all objects in this pool
*/
static void Clear()
{
if (ThreadSafe)
{
std::lock_guard<std::mutex> locker(_mutex);
auto pool = _pool;
auto _size = size;
if (_size <= 0)return;
for (int i = 0; i < _size; i++)
{
if (pool[i])
{
delete pool[i];
pool[i] = nullptr;
}
}
size = 0;
}
else
{
auto pool = _pool;
auto _size = size;
if (_size <= 0)return;
for (int i = 0; i < _size; i++)
{
if (pool[i])
{
delete pool[i];
pool[i] = nullptr;
}
}
size = 0;
}
}
inline static int Size()
{
if (ThreadSafe)
{
std::lock_guard<std::mutex> locker(_mutex);
return size
}
else
{
return size;
}
}
/**
* @brief print current pool status for debug
*/
static void PrintStatus()
{
int total = (sizeof(ClassType)* size);
if (total < 1024)
{
cout << "capacity:" << capacity << " size:" << size << " memeory:" << (sizeof(ClassType)* size) << "B " << typeid(ObjectPool<ClassType, ThreadSafe>).name() << endl;
}
else if (total < 1024 * 1024)
{
cout << "capacity:" << capacity << " size:" << size << " memeory:" << (sizeof(ClassType)* size) / 1024.0 << "KB " << typeid(ObjectPool<ClassType, ThreadSafe>).name() << endl;
}
else
{
cout << "capacity:" << capacity << " size:" << size << " memeory:" << (sizeof(ClassType)* size) / 1024.0 / 1024.0 << "MB " << typeid(ObjectPool<ClassType, ThreadSafe>).name() << endl;
}
}
};
template<class ClassType, bool ThreadSafe>
ClassType**ObjectPool<ClassType, ThreadSafe>::_pool = new ClassType*[OBJECT_POOL_DEFAULT_ALLOC_SIZE];//
template<class ClassType, bool ThreadSafe>
int ObjectPool<ClassType, ThreadSafe>::size = 0;
template<class ClassType, bool ThreadSafe>
std::mutex ObjectPool<ClassType, ThreadSafe>::_mutex;
template<class ClassType, bool ThreadSafe>
int ObjectPool<ClassType, ThreadSafe>::capacity = OBJECT_POOL_DEFAULT_ALLOC_SIZE;
//自带share_ptr版本 无需手动调用 Object::Release
//适用于 SharedObjectRecycleable的子类的对象池
//因为模板的模板 特化 不好处理 因此干脆重新开个名字 ShareObjectPool
template< typename ClassType, typename bool ThreadSafe = false>
class ShareObjectPool
{
/**
* @brief inner ctor class for Pool
*/
template< class ClassType, bool ThreadSafe = false>
class Ctor
{
public:
Ctor()
{//ctor
int capacity = ShareObjectPool<ClassType, ThreadSafe>::capacity;
auto pool = ShareObjectPool<ClassType, ThreadSafe>::_pool;
for (int i = 0; i < capacity; i++)
{
pool[i] = nullptr;
}
ShareObjectPool<ClassType, ThreadSafe>::PreAlloc();
}
~Ctor()
{//dtor
ShareObjectPool<ClassType, ThreadSafe>::Clear();
//如果编译报错 那么证明不是约束下的 子类关系 请确认
ClassType * s = nullptr;
s->___type_sub_class_restrain__SharedObjectRecycleable();
}
};
ShareObjectPool();
static int capacity;
static ClassType** _pool;
static int size;
static std::mutex _mutex;
private:
/**
* @brief resize inner pool growing by twice
* @warning this will copy old block and delete old
*/
static void ReSize()
{
auto pool = new ClassType*[capacity * 2];//
memset(pool, 0, sizeof(ClassType*)* 2 * capacity);
memcpy(pool, _pool, sizeof(ClassType*)* capacity);
capacity *= 2;
delete _pool;
_pool = pool;
}
static void PreAlloc()
{
auto pool = _pool;
for (int i = 0; i < OBJECT_POOL_DEFAULT_ALLOC_OBJECT_SIZE; i++)
{
pool[size] = new ClassType();
++size;
}
}
public:
/**
* @brief call this to new class who is the sub-class of ShareObjectRecycleable
* @note if class size if smaller than OBJECT_POOL_MIN_SIZEOF will new otherwise will gen object from pool
*/
static share_ptr<ClassType, ThreadSafe> Create()
{
if (ThreadSafe)
{
ClassType * ret = nullptr;
{
std::lock_guard<std::mutex> locker(_mutex);
static ShareObjectPool<ClassType, ThreadSafe>::Ctor<ClassType, ThreadSafe> ctor;//c11 compiler suport thread-safe
if (size > 0 && sizeof(ClassType) >= OBJECT_POOL_MIN_SIZEOF)
{
--size;
ret = (_pool[size]);
_pool[size] = nullptr;
}
}
if (!ret)
{
ret = new ClassType();
}
ret->ctor();
return share_ptr<ClassType, ThreadSafe>(ret);
}
else
{
static ShareObjectPool<ClassType, ThreadSafe>::Ctor<ClassType, ThreadSafe> ctor;//c11 compiler suport thread-safe
if (size > 0 && sizeof(ClassType) >= OBJECT_POOL_MIN_SIZEOF)
{
--size;
ClassType* ret = (_pool[size]);
_pool[size] = nullptr;
ret->ctor();
return share_ptr<ClassType, ThreadSafe>(ret);
}
//ctor will be call in share_ptr::share_ptr();
return share_ptr<ClassType, ThreadSafe>();
}
}
/**
* @brief release object to the pool
* @note this will not call manual ShareObjectRecycleable will call this function automatic
* @note if sizeof class is smaller than OBJECT_POOL_MIN_SIZEOF will delete now otherwise will put into pool
*/
static void Release(ClassType* who)
{
if (!who)return;
who->dtor();
if (sizeof(ClassType) < OBJECT_POOL_MIN_SIZEOF)
{
delete who;
return;
}
if (ThreadSafe)
{
std::lock_guard<std::mutex> locker(_mutex);
if (size >= OBJECT_POOL_MAX_SIZE)
{
cout << capacity << " " << typeid(ObjectPool<ClassType, ThreadSafe>).name() << " warnning Release out-of-size" << endl;
delete who;
return;
}
if (size >= capacity)
{
ReSize();
}
_pool[size] = who;
++size;
}
else
{
if (size >= OBJECT_POOL_MAX_SIZE)
{
cout << capacity << " " << typeid(ObjectPool<ClassType, ThreadSafe>).name() << " warnning Release out-of-size" << endl;
delete who;
return;
}
if (size >= capacity)
{
ReSize();
}
_pool[size] = who;
++size;
}
}
/**
* @brief delete all objects in this pool
*/
static void Clear()
{
if (ThreadSafe)
{
std::lock_guard<std::mutex> locker(_mutex);
if (size <= 0)return;
for (int i = 0; i < size; i++)
{
if (_pool[i])
{
delete _pool[i];
_pool[i] = nullptr;
}
}
size = 0;
}
else
{
if (size <= 0)return;
for (int i = 0; i < size; i++)
{
if (_pool[i])
{
delete _pool[i];
_pool[i] = nullptr;
}
}
size = 0;
}
}
inline static int Size()
{
if (ThreadSafe)
{
std::lock_guard<std::mutex> locker(_mutex);
return size
}
else
{
return size
}
}
/**
* @brief print current pool status for debug
*/
static void PrintStatus()
{
int total = (sizeof(ClassType)* size);
if (total < 1024)
{
cout << "capacity:" << capacity << " size:" << size << " memeory:" << (sizeof(ClassType)* size) << "B " << typeid(ShareObjectPool<ClassType, ThreadSafe>).name() << endl;
}
else if (total < 1024 * 1024)
{
cout << "capacity:" << capacity << " size:" << size << " memeory:" << (sizeof(ClassType)* size) / 1024.0 << "KB " << typeid(ShareObjectPool<ClassType, ThreadSafe>).name() << endl;
}
else
{
cout << "capacity:" << capacity << " size:" << size << " memeory:" << (sizeof(ClassType)* size) / 1024.0 / 1024.0 << "MB " << typeid(ShareObjectPool<ClassType, ThreadSafe>).name() << endl;
}
}
};
template<class ClassType, bool ThreadSafe>
ClassType**ShareObjectPool<ClassType, ThreadSafe>::_pool = new ClassType*[OBJECT_POOL_DEFAULT_ALLOC_SIZE];//
template<class ClassType, bool ThreadSafe>
int ShareObjectPool<ClassType, ThreadSafe>::size = 0;
template<class ClassType, bool ThreadSafe>
std::mutex ShareObjectPool<ClassType, ThreadSafe>::_mutex;
template<class ClassType, bool ThreadSafe>
int ShareObjectPool<ClassType, ThreadSafe>::capacity = OBJECT_POOL_DEFAULT_ALLOC_SIZE;
//T 只能是 SharedObjectRecycleable的子类
//12 bytes use in x86
//20 bytes use in x64
//ThreadSafe just mean ShareObjectPool not this class(share_ptr)
//this class is thread safe base-on std::shared_ptr
template<typename T, bool ThreadSafe = false>
class share_ptr
{
struct __inner_ref_wrapper
{
};
public:
//请勿随便使用该变量 除非你知道你在干什么
T * raw = nullptr;//4 bytes
//请勿随便使用该变量 除非你知道你在干什么
std::shared_ptr<__inner_ref_wrapper> __ptr = nullptr;//8 bytes
~share_ptr()
{
//thread-safe
if (__ptr.use_count() == 1)//only self ref this
{
//如果编译报错 那么证明不是约束下的 子类关系 请确认
ShareObjectPool<T, ThreadSafe>::Release((raw));
// ptr = NULL;
}
}
inline T *operator->() const
{
return this->raw;
}
share_ptr<T, ThreadSafe >& operator = (const share_ptr<T, ThreadSafe> & other)
{
this->__ptr = other.__ptr;
this->raw = other.raw;
return *this;
}
share_ptr() :
__ptr(std::make_shared<share_ptr<T, ThreadSafe >::__inner_ref_wrapper>()), raw(new T())
{
//new T will call ctor 不在Pool里面调用ctor是为了减少一个share_ptr的 构造
raw->ctor();
}
share_ptr(T*t) :
__ptr(std::make_shared<share_ptr<T, ThreadSafe >::__inner_ref_wrapper>()), raw(t)
{
}
share_ptr<T, ThreadSafe >(const share_ptr<T, ThreadSafe > &other) :
__ptr(other.__ptr), raw(other.raw)
{
}
};
/*
该函数无意义 因为不允许 不和Pool一起使用
template<typename T, bool ThreadSafe = false>
inline share_ptr<T, ThreadSafe> make_share()
{
return share_ptr<T, ThreadSafe>();
}*/
//ThreadSafe just mean ObjectPool not this class(RawObjectRecycleable)
template<typename SubClassType, bool ThreadSafe = false>
class RawObjectRecycleable :public RawObject, public Recycleable
{
public:
inline void Release()override
{
ObjectPool<SubClassType, ThreadSafe>::Release((SubClassType*)this);
}
};
//ThreadSafe just mean ObjectPool not this class(RefObjectRecycleable)
template<typename SubClassType, bool ThreadSafe = false>
class RefObjectRecycleable :public RefObject, public Recycleable
{
public:
inline void Release() override
{
--referenct_count;
if (referenct_count <= 0)
{
referenct_count = 0;
ObjectPool<SubClassType, ThreadSafe>::Release((SubClassType*)this);
}
}
};
//这个 和 其他的不一样 用法比较特别 因为要支持pool
//创建请用ShareObjectPool<>::Create OR make_share
template<typename SubClassType>
class SharedObjectRecycleable : public Recycleable
{
public:
//tag for class share_ptr T must is the sub-class of this class
//泛型约束
inline void ___type_sub_class_restrain__SharedObjectRecycleable()
{
}
};
#include<iostream>
#include "functional"
#include <chrono>
#include <thread>
using namespace std;
//cpp文件全部都是 测试代码 和 示例代码
class SharedObjectRecycleable111 :public SharedObjectRecycleable<SharedObjectRecycleable111>
{
public:
SharedObjectRecycleable111()
{
cout << "SharedObjectRecycleable111:SharedObjectRecycleable111" << endl;
}
~SharedObjectRecycleable111()
{
cout << "~~SharedObjectRecycleable111:~SharedObjectRecycleable111 " << this << endl;
}
virtual void ctor()
{
}
virtual void dtor()
{
xx = 10;
}
void print()
{
cout << " " << (++xx) << endl;
}
int xx = 10;
char sqdfqsd[30];//
};
class SharedObjectRecycleable222222 :public SharedObjectRecycleable<SharedObjectRecycleable222222>
{
public:
SharedObjectRecycleable222222()
{
// cout << "SharedObjectRecycleable222222:SharedObjectRecycleable222222" << endl;
}
~SharedObjectRecycleable222222()
{
// cout << "~~SharedObjectRecycleable222222:~SharedObjectRecycleable222222 " << this << endl;
}
virtual void ctor()
{
}
virtual void dtor()
{
xx = 10;
}
void print()
{
// cout << " " << (++xx) << endl;
}
int xx = 10;
char sqdfqsd[10240000];//
};
class RefObject2222 :public RefObject
{
public:
RefObject2222()
{
cout << "RefObject2222:RefObject2222" << endl;
}
~RefObject2222()
{
cout << "~~RefObject2222:~RefObject2222 " << this << endl;
}
};
class RefObject1111 :public RefObject
{
public:
RefObject1111()
{
cout << "RefObject1111:RefObject1111" << endl;
this->img = new RefObject2222();//默认图片
}
~RefObject1111()
{
cout << "~~RefObject1111:~RefObject1111 " << this << endl;
if (this->img)
{
this->img->Release();//计数-1
}
}
public:
void SetImage(RefObject2222 * img)
{
if (this->img)
{
this->img->Release();//计数-1
}
img->Retain();//计数+1
this->img = img;
}
RefObject2222 * img = nullptr;
};
class RefObjectRecycleable22222222 :public RefObjectRecycleable<RefObjectRecycleable22222222>
{
public:
RefObjectRecycleable22222222()
{
cout << "RefObjectRecycleable22222222:RefObjectRecycleable22222222" << endl;
}
~RefObjectRecycleable22222222()
{
cout << "~~RefObjectRecycleable22222222:~RefObjectRecycleable22222222 " << this << endl;
}
void ctor() {};
void dtor(){};
char sqdfqsd[1024];//
};
class RefObjectRecycleable1111111111 :public RefObjectRecycleable<RefObjectRecycleable1111111111>
{
public:
void ctor() {};
void dtor(){};
RefObjectRecycleable1111111111()
{
cout << "RefObjectRecycleable1111111111" << endl;
this->img = ObjectPool<RefObjectRecycleable22222222>::Create();//默认图片
}
~RefObjectRecycleable1111111111()
{
cout << "~~RefObjectRecycleable1111111111 " << this << endl;
if (this->img)
{
this->img->Release();//计数-1
}
}
char sqdfqsd[1024];//
public:
void SetImage(RefObjectRecycleable22222222 * img)
{
if (this->img)
{
this->img->Release();//计数-1
}
img->Retain();//计数+1
this->img = img;
}
RefObjectRecycleable22222222 * img = nullptr;
};
class SharedObject111 :public SharedObject<SharedObject111>
{
public:
SharedObject111()
{
cout << "SharedObject111:SharedObject111" << endl;
}
~SharedObject111()
{
cout << "~~SharedObject111:~SharedObject111 " << this << endl;
}
};
class RawObjectRecycleable11111111 : public RawObjectRecycleable<RawObjectRecycleable11111111>
{
public:
RawObjectRecycleable11111111()
{
cout << "RawObjectRecycleable11111111" << endl;
}
~RawObjectRecycleable11111111()
{
cout << "~~RawObjectRecycleable11111111 " << this << endl;
}
int x = 5;
void print()
{
cout << "print" << endl;
}
void ctor() {};
void dtor(){};
char sss[1024];
};
class RawObjectRecycleable666666 : public RawObjectRecycleable<RawObjectRecycleable666666, true>
{
public:
RawObjectRecycleable666666()
{
// cout << "RawObjectRecycleable666666" << endl;
}
~RawObjectRecycleable666666()
{
//cout << "~~RawObjectRecycleable666666 " << this << endl;
}
int x = 5;
void print()
{
cout << "print " << (++x) << endl;
}
void ctor() {};
void dtor(){ x = 5; };
char sss[10240];
};
#if _WIN32
#include "windows.h"
#include <WinBase.h>
int calculateMS(std::function<void()> processFunc)
{
long long _value;
LARGE_INTEGER freq, _start, _end;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&_start);
processFunc();
QueryPerformanceCounter(&_end);
_value = (_end.QuadPart - _start.QuadPart) * 1000 / freq.QuadPart;
return _value;
}
int calculateUS(std::function<void()> processFunc)
{
long long _value;
LARGE_INTEGER freq, _start, _end;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&_start);
processFunc();
QueryPerformanceCounter(&_end);
_value = (_end.QuadPart - _start.QuadPart) * 1000 * 1000 / freq.QuadPart;
return _value;
}
void func_test_benchmark_share_pool()
{
printf("%d \r\n\n", calculateUS([=]()
{
for (int i = 0; i != 10000; i++)
{
auto s1 =
ShareObjectPool< SharedObjectRecycleable111>::Create();
auto s2 =
ShareObjectPool< SharedObjectRecycleable111>::Create();
auto s3 =
ShareObjectPool< SharedObjectRecycleable111>::Create();
auto s4 =
ShareObjectPool< SharedObjectRecycleable111>::Create();
}
}));
printf("%d \r\n\n", calculateUS([=]()
{
for (int i = 0; i != 10000; i++)
{
auto s1 = make_shared<SharedObjectRecycleable111>();
auto s2 = make_shared<SharedObjectRecycleable111>();
auto s3 = make_shared<SharedObjectRecycleable111>();
auto s4 = make_shared<SharedObjectRecycleable111>();
}
}));
printf("%d \r\n\n", calculateUS([=]()
{
for (int i = 0; i != 10000; i++)
{
auto s1 = new SharedObjectRecycleable111();
delete s1;
auto s2 = new SharedObjectRecycleable111();
delete s2;
auto s3 = new SharedObjectRecycleable111();
delete s3;
auto s4 = new SharedObjectRecycleable111();
delete s4;
}
}));
auto s11 =
ShareObjectPool< SharedObjectRecycleable111>::Create();
ShareObjectPool<SharedObjectRecycleable111>::Clear();
ShareObjectPool< SharedObjectRecycleable111>::Clear();
}
#endif
//传递方法和 std::shared_ptr 一样
void func_test_share_pool_2(share_ptr<SharedObjectRecycleable111, false> obj)
{
//添加了一个引用
//引用为2
obj->print();
cout << obj.raw << endl;
}
//测试 ShareObjectPool 和example
void func_test_share_pool()
{
{
{
auto obj1 = ShareObjectPool< SharedObjectRecycleable111>::Create();
auto obj2 = obj1;//一个拷贝 和std::shared_ptr一样 直接传递对象即可
obj1->print();
cout << obj1.raw << endl;
}
//执行到这里 没有任何引用了 已经被 回收 Pool大小为1
//obj1 是刚刚回收的对象 和上面的是同一个对象
auto obj1 = ShareObjectPool< SharedObjectRecycleable111>::Create();
obj1->print();
cout << obj1.raw << endl;
//pool大小为0 创建了一个新的对象
auto obj2 = ShareObjectPool< SharedObjectRecycleable111>::Create();
obj2->print();//引用为1
cout << obj2.raw << endl;
func_test_share_pool_2(obj2);//执行完成后引用为1了
//由于pool为空 所以无效
ShareObjectPool< SharedObjectRecycleable111>::Clear();
cout << "-------" << endl;
}
//大小为2 被delete
ShareObjectPool< SharedObjectRecycleable111>::Clear();
}
void func_test_ref_object()
{
{
RefObject1111 *obj = new RefObject1111;//计数1
obj->Retain();//计数2
obj->Release();//计数1
obj->Release();//计数0 被delete
RefObject1111 *obj1 = new RefObject1111;//计数1
obj1->Release();//计数0 被delete
RefObject1111 *obj2 = new RefObject1111;//计数1
//obj2 泄露了
}
cout << "............0" << endl;
{
RefObject2222 *img = new RefObject2222;//计数1 图片资源
RefObject1111*sprite = new RefObject1111;//计数1 图片拥有者
sprite->SetImage(img);//--img计数2
img->Release();//变量img的 作用域交出控制权 img计数1
sprite->Release();//变量sprite 交出控制权 但是无其他引用 都被delete掉了
//img sprite 被全部清理了
}
}
void func_test_share_object()
{
auto obj1 = std::make_shared<SharedObject111>();//ok create one
std::shared_ptr<SharedObject111> obj0;// none ref
{
auto obj1 = std::make_shared<SharedObject111>();//ok create one
{
auto obj2 = obj1->shared_from_this();//create new from shared
obj0 = obj2->shared_from_this();//create from obj2
auto obj3 = obj1;//create from obj2
}
}
{
auto obj11 = std::make_shared<SharedObject111>();//ok create one
}
//obj11 has been delete
cout << "1111" << endl;
}
void func_test_raw_object_pool()
{
auto obj1 = ObjectPool<RawObjectRecycleable11111111>::Create();
obj1->Release();
auto obj2 = ObjectPool<RawObjectRecycleable11111111>::Create();
obj2->Release();
auto obj3 = ObjectPool<RawObjectRecycleable11111111>::Create();
obj3->Release();
cout << "111111111111" << endl;
ObjectPool<RawObjectRecycleable11111111, false>::Clear();
}
void func_test_ref_object_pool()
{
RefObjectRecycleable22222222 *obj = ObjectPool<RefObjectRecycleable22222222>::Create();//计数1
cout << " obj " << obj << endl;
obj->Retain();//计数2
obj->Release();//计数1
obj->Release();//计数0 被 ObjectPool回收
RefObjectRecycleable22222222 *obj1 = ObjectPool<RefObjectRecycleable22222222>::Create();//计数1
cout << " obj1 " << obj1 << endl;
obj1->Release();//计数0 被 ObjectPool回收
cout << "............0" << endl;
RefObjectRecycleable1111111111 *obj2 = ObjectPool<RefObjectRecycleable1111111111>::Create();//计数1
cout << " obj2 " << obj2 << endl;
cout << " obj2 img " << obj2->img << endl;//this img is in old object obj
obj2->Release();//计数0 被 ObjectPool回收
/* RefObject1111 *obj1 = new RefObject1111;//计数1
obj1->Release();//计数0 被delete
RefObject1111 *obj2 = new RefObject1111;//计数1
//obj2 泄露了
}
cout << "............0" << endl;
{
RefObject2222 *img = new RefObject2222;//计数1 图片资源
RefObject1111*sprite = new RefObject1111;//计数1 图片拥有者
sprite->SetImage(img);//--img计数2
img->Release();//变量img的 作用域交出控制权 img计数1
sprite->Release();//变量sprite 交出控制权 但是无其他引用 都被delete掉了
//img sprite 被全部清理了
*/
cout << "............0" << endl;
ObjectPool<RefObjectRecycleable22222222>::Clear();
}
void func_test_share_object_pool_thread_safe()
{
for (int i = 0; i < 10; i++)
{
std::thread t([=]
{
int i = 300;
while (--i>0)
{
auto s4 =
ShareObjectPool< SharedObjectRecycleable222222, true>::Create();
// auto obj1 = ObjectPool<RawObjectRecycleable666666, true>::Create();
// cout << obj1 << endl;
// if (obj1) obj1->Release();
// ObjectPool<RawObjectRecycleable666666, true>::Clear();
}
cout << "............thread exit" << endl;
});
t.detach();
}
this_thread::sleep_for(std::chrono::milliseconds(20));
ShareObjectPool< SharedObjectRecycleable222222, true>::PrintStatus();
ShareObjectPool< SharedObjectRecycleable222222, true>::Clear();
}
void func_test_raw_object_pool_thread_safe()
{
for (int i = 0; i < 10; i++)
{
std::thread t([=]
{
int i = 3000;
while (--i>0)
{
auto obj1 = ObjectPool<RawObjectRecycleable666666, true>::Create();
obj1->Release();
auto obj2 = ObjectPool<RawObjectRecycleable666666, true>::Create();
obj2->Release();
}
cout << "............thread exit" << endl;
});
t.detach();
}
this_thread::sleep_for(std::chrono::milliseconds(20));
auto obj1 = ObjectPool<RawObjectRecycleable666666, true>::Create();
obj1->Release();
ObjectPool< RawObjectRecycleable666666, true>::PrintStatus();
ObjectPool< RawObjectRecycleable666666, true>::Clear();
}
static std::mutex __mutex;
void __func_mutex()
{
// std::lock_guard<std::mutex> loc(__mutex);
__mutex.lock();
static int xx = 0;
xx++;
__mutex.unlock();
}
void func_test_raw_object_pool_thread_safe__bug_()
{
for (int i = 0; i < 10; i++)
{
std::thread t([=]
{
int i = 30000;
while (i>0)
{
// std::this_thread::yield();
//Sleep(1);// will reduce bug rate
__func_mutex();//BUG when main function return static variable _mutex was destroy but sub-thread still use this.
//mutex destroyed while busy
//TODO fixed me
}
cout << "............thread exit" << endl;
});
t.detach();
}
this_thread::sleep_for(std::chrono::milliseconds(2000));
}
int main(int argc, char* argv[])
{
func_test_raw_object_pool_thread_safe__bug_();
// func_test_raw_object_pool_thread_safe();
//Sleep(10000000);// 20 second
//exit(0);
system("pause");
return 0;
}