首页 > 程序人生 > 深入浅出对象池(Object Pool)

深入浅出对象池(Object Pool)

在稍微大型一点的软件系统开发中,通常我们会用到内存池,对象池,线程池,连接池等各种各样的池(Pool),本文就来讲一讲对象池(Object Pool)。下面从四个方面来介绍一下对象池:

1.什么是对象池(Object Pool) ?
池(Poo), 与集合在某种意义上有些相似。 水池,是一定数量的水的集合;内存池,是一定数量的已经分配好的内存的集合;线程池,是一定数量的已经创建好的线程的集合。那么,对象池,顾名思义就是一定数量的已经创建好的对象(Object)的集合。

2.对象池是干什么的?
举个生活中水池的例子,在没有水池的时候,每次用水,都要去很远的地方挑水;有了水池之后的,一次挑很多水来,放在水池蓄下来,这样以后的一段时间内,用水的时候就不用去挑了,直接从水池取就可以了。同样的道理,在C/C++的程序中,如果一种对象,你要经常用malloc/free(或new/delete)来创建、销毁,这样子一方面开销会比较大,另一方面会产生很多内存碎片,程序跑的时间一长,性能就会下降。这个时候,就产生了对象池。可以事先创建好一批对象,放在一个集合中,以后每当程序需要新的对象时候,都从对象池里获取,每当程序用完该对象后,都把该对象归还给对象池。这样,就会少了很多的malloc/free(new/delete)的调用,在一定程度上提高了系统的性能,尤其在动态内存分配比较频繁的程序中效果较为明显。

3.对象池有什么特征?
一般来说,对象池有下面几个特征:
(1)对象池中有一定数量已经创建好的对象
(2)对象池向用户提供获取对象的接口,当用户需要新的对象时,便可通过调用此接口获取新的对象。如果对象池中有事先创建好的对象时,就直接返回给用户;如果没有了,对象池还可以创建新的对象加入其中,然后返回给用户
(3)对象池向用户提供归还对象的接口,当用户不再使用某对象时,便可通过此接口把该对象归还给对象池

4.怎么实现一个对象池?
下面是一个对象池的C++简单实现,感兴趣的朋友可以自己研究一下,由于程序比较简单,在这里,我就不再说明了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <list>
 
template<typename Object>
class ObjectPool
{
public:
 
    ObjectPool(size_t unSize) :
        m_unSize(unSize)
    {
        for (size_t unIdx = 0; unIdx < m_unSize; ++ unIdx)
	{
	    m_oPool.push_back(new Object());
	}
    }
 
    ~ObjectPool()
    {
	typename std::list<Object *>::iterator oIt = m_oPool.begin();
	while (oIt != m_oPool.end())
	{
		delete (*oIt);
		++ oIt;
	}
	m_unSize = 0;
    }
 
    Object * GetObject()
    {
        Object * pObj = NULL;
        if (0 == m_unSize)
        {
            pObj = new Object();
        }
        else
        {
            pObj = m_oPool.front();
            m_oPool.pop_front();
            -- m_unSize;
        }
 
        return pObj;
    }
 
    void ReturnObject(Object * pObj)
    {
        m_oPool.push_back(pObj);
        ++ m_unSize;
    }
 
private:
 
    size_t m_unSize;
 
    std::list<object *> m_oPool;
};
</object></typename></list>
  1. leungma
    2010年3月13日23:04 | #1

    如果对象池在互斥上做的不好,是否会成为瓶颈?

    • 2010年3月13日23:57 | #2

      1. 关于在对象池上做互斥是不是会成为瓶颈,这个要平衡来看:内存和CPU之间,你的程序到底更看重哪个。如果看重CPU呢,你觉得对象池上加锁会影响性能,那就索性不要用对象池了;如果你更看重内存,那就牺牲一点CPU,用对象池来优化一下内存的使用。 我的经验呢,一般情况下,对象池上加锁,是不会成为瓶颈的,除非你的程序性能要求非常苛刻。

      2. 关于QQMail被认为非法,这个目前我也不知道是怎么回事,可能是wordpress内部实现的原因吧。

  2. leungma
    2010年3月13日23:05 | #3

    如果对象池在互斥上做的不好,是否会成为瓶颈?
    PS:为什么留QQ邮箱,会认为是非法的?
    Please enter a valid email address.

  3. 2010年3月22日13:16 | #4

    @leungma 换新的主机和主题了,留言邮箱的问题也解决了~~ 欢迎光临~~

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
您必须在 登录 后才能发布评论.