まずは、スマートポインタについて。
スマートポインタとは、登録したオブジェクトがどこからも参照されなくなったさい、自動でdeleteを呼んでくれる便利クラス。ガベージコレクションの実装された言語ばかりさわってた自分にとって、これはすごくありがたい。
shared_ptrやauto_ptr、intrusive_ptr等が存在するけど、今回はshared_ptrとintrusive_ptrの使い方とパフォーマンスを比較してみた。
#include <iostream>
#include <boost/intrusive_ptr.hpp>
#include <boost/shared_ptr.hpp>
#include <time.h>
#include <sys/time.h>
class testClass {
public:
testClass():refCount(0) {}
~testClass() {}
static inline boost::intrusive_ptr<testClass> createInPtr()
{
return boost::intrusive_ptr<testClass>(new testClass());
}
static inline boost::shared_ptr<testClass> createShPtr()
{
return boost::shared_ptr<testClass>(new testClass());
}
private:
// intrusive_ptr用 参照カウンタ
int refCount;
// intrusive_ptr用 参照が増えた時呼ばれる処理
friend void intrusive_ptr_add_ref( testClass* p )
{
p->refCount++;
}
// intrusive_ptr用 参照が減った時呼ばれる処理 参照が0になるとdeleteが呼ばれる。
friend void intrusive_ptr_release( testClass* p )
{
p->refCount--;
if (p->refCount <= 0) delete p;
}
};
typedef boost::intrusive_ptr<testClass> inPtr;
typedef boost::shared_ptr<testClass> shPtr;
// 時間計測用
double gettimeofday_sec()
{
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec + (double)tv.tv_usec*1e-6;
}
int main () {
int max_count = 1000000;
double start, end;
// 比較用 ふつーに new delete //////////////
start = gettimeofday_sec();
for (int i = 0; i < max_count; i++){
testClass *tp = new testClass();
delete tp;
}
end = gettimeofday_sec();
printf("%f new delete\n", end - start);
// shared_ptr ///////////////////////////
start = gettimeofday_sec();
for (int i = 0; i < max_count; i++){
shPtr tcShp = testClass::createShPtr();
}
end = gettimeofday_sec();
printf("%f shared_ptr\n", end - start);
// intrusive_ptr ///////////////////////
start = gettimeofday_sec();
for (int i = 0; i < max_count; i++){
inPtr tcInp = testClass::createInPtr();
}
end = gettimeofday_sec();
printf("%f intrusive_ptr\n", end - start);
return 0;
}
実行速度はこんな感じになった
0.065289 new deleteshared_ptrがかなり遅い。内部で参照カウンタをnewしてるせいか。
0.178643 shared_ptr
0.059417 intrusive_ptr
てか、new delete自体も意外なほどマイペース。
メモリプールをつかってパフォーマンスの改善を試してみたので次回にまとめる。
0 件のコメント:
コメントを投稿