nginx学习之 双向链表nginx_queue_t 性能测试: 10倍于STL!

nginx 以其高性能著称于世, 今天对其双向链表 ngx_queue_t 和 STL的list做了一下性能对比测试, 果然不孚所望.

先上结论, 令人吃惊:

   1, 就插入和删除操作来说, nginx_queue_t 的性能差不多是STL list的10倍左右

   2, nginx_queue_t 非常轻量级,没有诸如 size(),reverse() 等STL list的功能

   3, nginx_queue_t 有一个限制: 不能将同一节点同时多次插入 (即链表中的节点不能重复)

   4, 由于nginx_queue_t 的接口大多用宏实现, 使用时注意不要嵌套


nginx_queue_t 只有两个指针, 不得不惊叹于nginx的简洁的设计和优化到极致的性能



上测试代码之前先提一个坑, 即上文结论中的第四点, 因为其"函数"实现大多为宏, 由于运算符优先级的问题, 如果嵌套使用,很可能会产生不易察觉的bug ,举例如下. 


下面是测试代码的主要部分, 完整代码见:

测试环境:
OS: redhat6
C++:  11
nginx: 1.4.7 stable

测试流程
1,从前端插入15W次
2,从后端插入15W次
3,从后端删除15W次
4,从前端删除15W次
分别统计时间

nginx_queue_t 测试代码:
        ngx_queue_t nq;
        ngx_queue_init(&nq);
        printf("nginx queue test:\n");
        gettimeofday(&start,0);
        
        i=0;
        for(;i<max/2;i++)
        {
                ngx_queue_insert_head(&nq,&(nodes[i].qEle));
        }
        print_time("nq push head");
        for(;i<max;i++)
        {
                ngx_queue_insert_tail(&nq,&nodes[i].qEle);
        }
        print_time("nq push back");
        i=0;
        for(;i<max/2;i++)
        {
                ptr = ngx_queue_last(&nq);
                ngx_queue_remove(ptr);
        }
        print_time("nq pop back");
        for(;i<max;i++)
        {       
                ptr = ngx_queue_head(&nq);
                ngx_queue_remove(ptr);                  
        }
        print_time("nq pop head");
        assert(ngx_queue_empty(&nq));

STL list 测试代码:
        printf("stl list test:\n");
        list<TestNode_stl*> sl;
        i=0;
        gettimeofday(&start,0);
        for(;i<max/2;i++)
        {
                sl.push_back(&snodes[i]);
        }
        print_time("sl push back");
        for(;i<max;i++)
        {
                sl.push_front(&snodes[i]);
        }
        print_time("sl push head");
        assert(sl.size() == max);

        i=0;
        for(;i<max/2;i++)
        {
                sl.pop_back();
        }
        print_time("sl pop back");
        for(;i<max;i++)
        {
                sl.pop_front();
        }
        print_time("sl pop head");
        assert(sl.empty());

测试结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值