nginx学习之 双向链表nginx_queue_t 性能测试: 10倍于STL!
2014-03-24 22:28
537 查看
nginx 以其高性能著称于世, 今天对其双向链表 ngx_queue_t 和 STL的list做了一下性能对比测试, 果然不孚所望.
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 测试代码:
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的简洁的设计和优化到极致的性能
下面是测试代码的主要部分, 完整代码见:
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学习六 高级数据结构之双向链表ngx_queue_t
- 【nginx源码学习与运用 五】双向链表ngx_queue_t
- Nginx高级数据结构总结之 ngx_queue_t 双向链表
- 【nginx】双向队列(ngx_queue.h)的分割队列(链表) ngx_queue_split操作
- C++ STL学习笔记四 list双向链表容器
- nginx学习六 高级数据结构之双向链表ngx_queue_t
- C++ STL学习笔记四 list双向链表容器
- 【nginx】双向队列(ngx_queue.h)的合并队列(链表) ngx_queue_add操作
- Nginx 队列双向链表结构 ngx_queue_t
- nginx性能优化及测试
- STL(五)list 双向链表
- nginx折腾记(HTTP性能能测试,与Apache对比)
- 【C++数据结构学习笔记---线性表】带头结点的双向循环链表
- android源代码学习 init中的双向链表listnode
- jmeter学习笔记(三)-性能测试概念
- (学习java)双向循环链表
- [置顶] MySQL Cluster初步学习资料整理--安装部署新特性性能测试等
- nginx折腾记(HTTP性能能测试,与Apache对比)
- JMeter性能测试学习笔记——几个性能测试知识点
- nginx双向队列ngx_queue_t使用例子