単純メモリプール
2508 ワード
System Call
まず、new/deleteを呼び出すシステムの使用時間をテストします.
#include <iostream>
#include <time.h>
using namespace std;
timespec diff(timespec start, timespec end)
{
timespec temp;
if((end.tv_nsec-start.tv_nsec)<0) {
temp.tv_sec = end.tv_sec-start.tv_sec-1;
temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
}
else
{
temp.tv_sec = end.tv_sec-start.tv_sec;
temp.tv_nsec = end.tv_nsec-start.tv_nsec;
}
return temp;
}
class TestClass
{
private:
char m_chBuf[4096];
};
int main()
{
timespec time1, time2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
for(unsigned int i=0; i< 0x5fffff; i++)
{
TestClass *p = new TestClass;
delete p;
}
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
cout<<diff(time1,time2).tv_sec<<":"<<diff(time1,time2).tv_nsec<<endl;
}
使用時間は0:604124400です.
Memory Pool
単純メモリプールを再テストします.
#include <iostream>
#include <time.h>
using namespace std;
char buf[4100]; //
class TestClass
{
public:
void* operator new(size_t)
{
return (void*)buf;
}
void operator delete(void* p)
{
}
private:
char m_chBuf[4096];
};
timespec diff(timespec start, timespec end)
{
timespec temp;
if((end.tv_nsec-start.tv_nsec)<0) {
temp.tv_sec = end.tv_sec-start.tv_sec-1;
temp.tv_nsec = 1000000000+end.tv_nsec-start.tv_nsec;
}
else
{
temp.tv_sec = end.tv_sec-start.tv_sec;
temp.tv_nsec = end.tv_nsec-start.tv_nsec;
}
return temp;
}
int main()
{
timespec time1, time2;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time1);
for(unsigned int i=0; i< 0x5fffff; i++)
{
TestClass *p = new TestClass;
delete p;
}
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &time2);
cout<<diff(time1,time2).tv_sec<<":"<<diff(time1,time2).tv_nsec<<endl;
}
使用時間は0:39420791です.両者は20倍の差がある.
実はシステムのnewはスタックにリソースを割り当て、実行するたびに割り当てて破棄します.
単純メモリプールは、グローバル/静的ストレージ領域でリソースの割り当てを開始し、常に存在します.リロードされるたびにnew呼び出しはbufのアドレスを返すだけなので速い.
プログラムがmalloc/freeまたはnew/deleteを頻繁にシステム呼び出してメモリを割り当てる場合にのみ、メモリプールは価値があります.
Reference
[1].http://www.codeproject.com/Articles/27487/Why-to-use-memory-pool-and-how-to-implement-it
[2].http://blog.chinaunix.net/uid-12461657-id-3183111.html