信息化 频道

企业信息化成功 要素及风险状况分析


示例程序

    示例程序非常简单,仅是声明两个几乎一样的类:一个使用了CFixedAlloc而另一个没用。接下来,创建了大量的对象,创建过程是计时的,完成之后,会显示结果。要计算未用CFixedAlloc的类大小开销,在此使用了__V6_HEAP,这种情况非常少见,因此计算值可能不完全准确,但一般来看,应该是比较正确了。
#define ITER_NUM 1000*1024 

class A
{
public:
A( A *next ) : m_next(next) {}
A *m_next;
int dummy1;
int dummy2;
};

class B
{
public:
B( B *next ) : m_next(next) {}
B *m_next;
int dummy1;
int dummy2;

DECLARE_FIXED_ALLOC(B);
};

IMPLEMENT_FIXED_ALLOC(B,ITER_NUM);

void CCFixedAllocDemoDlg::OnTestTimebutton()
{
//可在此添加控件通知处理代码
A *curAObj, *firstAObj = NULL;
B *curBObj, *firstBObj = NULL;
DWORD startA, endA, startB, endB;
register int i;
{
CWaitCursor wait;

startA = GetTickCount();

for( i = 0; i < ITER_NUM; i++ )
{
firstAObj = new A(firstAObj);
}
while( firstAObj )
{
curAObj = firstAObj->m_next;
delete firstAObj;
firstAObj = curAObj;
}

startB = endA = GetTickCount();

for( i = 0; i < ITER_NUM; i++ )
{
firstBObj = new B(firstBObj);
}
while( firstBObj )
{
curBObj = firstBObj->m_next;
delete firstBObj;
firstBObj = curBObj;
}

endB = GetTickCount();
}

displayResult( endA-startA,endB-startB );
}

#define BYTES_PER_PARA 16

void CCFixedAllocDemoDlg::displayResult( DWORD timeA, DWORD timeB )
{
TCHAR buf[1024];

/*
* 每个A对象占用32字节。
*/
int overheadA = (32-sizeof(A))*ITER_NUM;

/*
*首先计算已分配大小,再减去所请求大小。
*/
int overheadB =
(8+sizeof(B)*ITER_NUM + sizeof(CPlex) + (BYTES_PER_PARA-1))
& ~(BYTES_PER_PARA - 1);
overheadB -= sizeof(B)*ITER_NUM;

wsprintf( buf, __TEXT("Creating and destroying %d objects\n")
__TEXT("without CFixedAlloc\t: M ms\n")
__TEXT("with CFixedAlloc\t: M ms\n")
__TEXT("You saved %d bytes with CFixedAlloc"),
ITER_NUM, timeA, timeB,
overheadA - overheadB );
MessageBox(buf,__TEXT("Results"));
}
0
相关文章