内存池和tcmalloc的性能比较

这次使用的内存池是原公司的,利用hash_map做的,大概的接口是这样:

template <class CObject>
class ObjectPool
{ <br>public:<br>    typedef hash_map<int64_t,ObjectBlock*> BlockMap;
    virtual int pop(CObject *&ob);
    virtual int push(const CObject *ob);<br>private:<br>    BlockMap _block_map;
};

写测试代码比较了一下内存池和tcmalloc的差距!结果挺让人吃惊!

#define MAX_SIZE 50000

struct MsgToPut
{
     UINT _wr_ptr;
     UINT _rd_ptr;
     UINT _length;
     CHAR _base[1024];

     void reset()
     {
         this->_rd_ptr = this->_wr_ptr = 0;
         this->_length = 1024;
     }
};

ObjectPool<MsgToPut> MsgPool;

void* newthread(void* argv)
{
    long long int start = get_os_system_time();

    for(int i=0;i<MAX_SIZE;i++)
    {
        MsgToPut* msg;
        MsgPool.pop(msg);
        if(msg == NULL)
        {
            printf("error\n");
        }
    }

    long long int end = get_os_system_time();

    printf("newthread ObjectPool:%d\n",end - start);

    MsgToPut* mtp[MAX_SIZE];

    for(int i=0;i<MAX_SIZE;i++)
    {
        mtp[i] = (MsgToPut*)tc_malloc(sizeof(MsgToPut));
        mtp[i]->reset();
    }

    start = get_os_system_time();
    printf("newthread tc malloc :%d\n",start - end);

    return (void*)0;
}

int main()
{

    pthread_t pid;
    pthread_create(&pid,NULL,newthread,NULL);
    pthread_create(&pid,NULL,newthread,NULL);
    pthread_create(&pid,NULL,newthread,NULL);

    long long int start = get_os_system_time();

    for(int i=0;i<MAX_SIZE;i++)
    {
        MsgToPut* msg = NULL;
        MsgPool.pop(msg);
        if(msg == NULL)
        {
            printf("error\n");
        }
    }

    long long int end = get_os_system_time();

    printf("main ObjectPool:%d\n",end - start);

    MsgToPut* mtp[MAX_SIZE];

    for(int i=0;i<MAX_SIZE;i++)
    {
        mtp[i] = (MsgToPut*)tc_malloc(sizeof(MsgToPut));
        mtp[i]->reset();
    }

    start = get_os_system_time();
    printf("main tc malloc :%d\n",start - end);

    return 0;
}

普遍打印数据为:

newthread ObjectPool:189
newthread ObjectPool:202
newthread tc malloc :24
newthread tc malloc :20
main ObjectPool:235
newthread ObjectPool:235
main tc malloc :21
newthread tc malloc :22

时间: 2024-12-03 17:56:46

内存池和tcmalloc的性能比较的相关文章

内存池

转自http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html (还没看懂,先Mark一下) 如前所述,读者已经了解到"堆"和"栈"的区别.而在编程实践中,不可避免地要大量用到堆上的内存.例如在程序中维护一个链表的数据结构时,每次新增或者删除一个链表的节点,都需要从内存堆上分配或者释放一定的内存:在维护一个动态数组时,如果动态数组的大小不能满足程序需要时,也要在内存堆上分配新的内存空间. 6.1.1

内存池技术介绍

看到一篇关于内存池技术的介绍文章,受益匪浅,转贴至此.   原贴地址:http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html  6.1 自定义内存池性能优化的原理   如前所述,读者已经了解到"堆"和"栈"的区别.而在编程实践中,不可避免地要大量用到堆上的内存.例如在程序中维护一个链表的数据结构时,每次新增或者删除一个链表的节点,都需要从内存堆上分配或者释放一定的内存:在维护一个动态数组时,如果

当Java虚拟机遇上Linux Arena内存池

故障案例一 系统环境: RHEL 6.8 64-bit(glibc 2.12).Sun JDK 6u45 64-bit.WLS 10.3.6 故障现象: 这里引用一下客户当时发邮件时提出的问题描述吧. 下面pid 6287 weblogic进程占用7.6G的物理内存,之前只占用5G内存.我发现只有系统有空余的内存,就会被java给吃掉,为什么内存占用越来越多? 通过jmap -histo:live 6287 查看内存只占用800多MB. Total 12415620 891690640 此时,操

基于C语言的内存池的设计与实现

介绍:        设计内存池的目标是为了保证服务器长时间高效的运行,通过对申请空间小而申请频繁的对象进行有效管理,减少内存碎片的产生,合理分配管理用户内存,从而减少系统中出现有效空间足够,而无法分配大块连续内存的情况. 目标:     此次设计内存池的基本目标,需要满足线程安全性(多线程),适量的内存泄露越界检查,运行效率不太低于malloc/free方式,实现对4-128字节范围内的内存空间申请的内存池管理(非单一固定大小对象管理的内存池). 内存池技术设计与实现     本内存池的设计方

内存池的C++实现(可能还有小bug)

最近在学习c++程序性能优化,读到内存池部分.自己动手写了一个,小小测试了一下应 该没有问题. 内存块MemoryBlock声明文件 MemoryBlock.h #pragma once #define USHORT unsigned short #define ULONG unsigned long #include <iostream> using namespace std; //内存块 struct MemoryBlock { USHORT m_nSize;//可分配内存总大小 USH

高并发服务器的设计之内存池的设计

不同的业务,设计也不尽相同,但至少都一些共同的追求,比如性能. 做服务器开发很多年 了,有时候被人问到,服务器性能是什么呢?各种服务器间拼得是什么呢? 简单的回答就是QPS ,并发数,但有时候想想也许也不对. QPS与并发数是针对同样的业务而言的,业务不同,相同 的服务器能承受的压力也会不同. 性能,也许可以打个俗点的比方: 服务器就是一艘船 ,性能就是船的容量,开的速度,行得是否稳当. 该用的用,该省的省.能用内存就别用IO, CPU则能少用就少用,相同的QPS,CPU和内存用的少点的性能就要

定长内存池之BOOST::pool

内存池可有效降低动态申请内存的次数,减少与内核态的交互,提升系统性能,减少内存碎片,增加内存空间使用率,避免内存泄漏的可能性,这么多的优点,没有理由不在系统中使用该技术. 内存池分类: 1.              不定长内存池.典型的实现有apr_pool.obstack.优点是不需要为不同的数据类型创建不同的内存池,缺点是造成分配出的内存不能回收到池中.这是由于这种方案以session为粒度,以业务处理的层次性为设计基础. 2.             定长内存池.典型的实现有LOKI.B

详解Nginx中基本的内存池初始化配置_nginx

ngx_cycle 的初始化整个初始化过程中,最重要的就是全局变量 nginx_cycle 的初始化,很多变量都是在这个过程中初始化的 nginx_cycle 又是通过两个局部变量 init_cycle 和 cycle 实现初始化的 事实上,日志初始化也可以算是对 nginx_cyle 的初始化,因为在代码中接下来马上要发生的就是一个赋值 ngx_memzero(&init_cycle, sizeof(ngx_cycle_t)); init_cycle.log = log; ngx_cycle

内核内存池管理技术实现分析【转】

转自:http://blog.chinaunix.net/uid-23634108-id-2393485.html 一.Linux系统内核内存管理简介 Linux采用"按需调页"算法,支持三层页式存储管理策略.将每个用户进程4GB长度的虚拟内存划分成固定大小的页面.其中0至3GB是用户态空间,由各进程独占:3GB到4GB是内核态空间,由所有进程共享,但只有内核态进程才能访问. Linux将物理内存也划分成固定大小的页面,由数据结构page管理,有多少页面就有多少page结构,它们又作为