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的简洁的设计和优化到极致的性能
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));
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());