信息化 频道

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


建议

    如果移除临界区,把CFixedAlloc作为单线程版本,还可进一步提高性能,这点微软也想到了,从MFC7(VC++.NET 2002)开始,就添加了对单线程的支持,最新的Visual C++ 2008当然也不例外。如果想使用单线程版本的CFixedAlloc,就可使用以下宏:
// DECLARE_FIXED_ALLOC -- used in class definition 
#define DECLARE_FIXED_ALLOC_NOSYNC(class_name) \
public: \
void* operator new(size_t size) \
{ \
ASSERT(size == s_alloc.GetAllocSize()); \
UNUSED(size); \
return s_alloc.Alloc(); \
} \
void* operator new(size_t, void* p) \
{ return p; } \
void operator delete(void* p) { s_alloc.Free(p); } \
void* operator new(size_t size, LPCSTR, int) \
{ \
ASSERT(size == s_alloc.GetAllocSize()); \
UNUSED(size); \
return s_alloc.Alloc(); \
} \
protected: \
static CFixedAllocNoSync s_alloc \

// IMPLEMENT_FIXED_ALLOC_NOSYNC -- used in class
// implementation file
#define IMPLEMENT_FIXED_ALLOC_NOSYNC(class_nbame, block_size) \
CFixedAllocNoSync class_name::s_alloc(sizeof(class_name),
block_size) \
    不过在IMPLEMENT_FIXED_ALLOC_NOSYNC()宏中有一个小错误,宏参数class_nbame应该为class_name(注:这个错误在Visual C++ 2008中依然存在)。看起来在MFC中并没有使用这些宏,要不然早就发现这个语法错误了,同时,这也意味着这个非同步版本可能未被MFC开发小组所测试。不管怎样,这个错误很小,而且在修正之后丝毫不影响使用,也正是因为MFC中没有使用这个宏,所以修正之后也无需再重新编译MFC。

   /*
   *取消第一行define语句前的注释符号就可以使用单线程版本的CFixedAlloc
   *在重新编译之前,必须修正fixalloc.h中的语法错误
   * IMPLEMENT_FIXED_ALLOC_NOSYNC()宏参数中的class_nbame应为class_name
   *
   *注意:单线程版本只可用在VC++.NET及以上版本中

//#define _USE_SINGLE_THREAD 

#ifndef _USE_SINGLE_THREAD
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);
#else
class B
{
public:
B( B *next ) : m_next(next) {}
B *m_next;
int dummy1;
int dummy2;

DECLARE_FIXED_ALLOC_NOSYNC(B);
};

IMPLEMENT_FIXED_ALLOC_NOSYNC(B,ITER_NUM);
#endif
    测试程序表明非同步版本相对于原CFixedAlloc版本,带来了40%的速度提升,可别犯迷糊,非同步版本可不能用在多线程程序中喔。
0
相关文章