您的位置:首页 > 运维架构 > Nginx

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

2014-03-24 22:28 489 查看
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 ,举例如下. 



下面是测试代码的主要部分, 完整代码见:
https://github.com/poppick/GreenDragon/tree/master/nginx/study/queue

测试环境:
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());


测试结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  nginx 性能 测试 stl 链表