httprouter与 fasthttp 的性能对比
关于协议:
本打算接入层使用gRPC,虽然基于HTTP 2.0 效率比较高,而且使用protobuf 能进行高效的序列化。但是本次系统需要和
JAVA进行对接,考虑到gRPC对JAVA的支持性不是很好,资源并不多,可能在踩坑上花过多的时间,所以综合考虑还是使用restful 进行对接
后续如果有机会还是会考虑使用gRPC。所以下面对几个go的http框架进行简单的对比
- 1
- 2
- 3
测试工具:
ApacheBench
- 1
参数:
ab -n 6000 -c 300 http://url:port
可能机器原因只能给到这么大的参数了
- 1
- 2
- 3
测试环境:
型号:imac macos 10.13
内存:8
cpu核心数:4
为了模拟网络请求处理时间,所以在处理的Handle function 中加入了 time.Sleep(200 *time.Millisecond)
- 1
- 2
- 3
- 4
测试对象:
httprouter:本打算使用gin 框架进行测试,但是fasthttp是一个http的包 使用 gin使用的httprouter
进行测试,优势在于实现了restful 风格的地址,使用前缀树实现了路由查找,使用了go 的标准包 http包 开启一个服务
fasthttp:优势在于自己实现了http服务,内部大量的池化,并不是每个请求都和http包一样开启一个goroutine,
同是也使用[]byte 操作去 代替string 操作,减少了内存的分配。
- 1
- 2
- 3
- 4
- 5
测试数据:
1、fasthttp
Server Software: fasthttp
Server Hostname: 127.0.0.1
Server Port: 8083
Document Path: /index
Document Length: 3 bytes
Concurrency Level: 300
Time taken for tests: 4.371 seconds
Complete requests: 6000
Failed requests: 0
Total transferred: 936000 bytes
HTML transferred: 18000 bytes
Requests per second: 1372.81 [#/sec] (mean)
Time per request: 218.530 [ms] (mean)
Time per request: 0.728 [ms] (mean, across all concurrent requests)
Transfer rate: 209.14 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 6 4.5 7 26
Processing: 200 209 5.2 208 223
Waiting: 200 206 4.1 206 221
Total: 201 215 8.5 217 246
Percentage of the requests served within a certain time (ms)
50% 217
66% 221
75% 222
80% 223
90% 225
95% 227
98% 231
99% 235
100% 246 (longest request)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
2、httprouter
Server Software:
Server Hostname: 127.0.0.1
Server Port: 8081
Document Path: /index
Document Length: 9 bytes
Concurrency Level: 300
Time taken for tests: 4.343 seconds
Complete requests: 6000
Failed requests: 0
Total transferred: 750000 bytes
HTML transferred: 54000 bytes
Requests per second: 1381.60 [#/sec] (mean)
Time per request: 217.140 [ms] (mean)
Time per request: 0.724 [ms] (mean, across all concurrent requests)
Transfer rate: 168.65 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 5 4.1 4 19
Processing: 200 209 6.0 207 227
Waiting: 200 206 3.9 205 227
Total: 201 214 9.4 211 243
Percentage of the requests served within a certain time (ms)
50% 211
66% 220
75% 223
80% 224
90% 227
95% 229
98% 233
99% 236
100% 243 (longest request)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
httprouter 并发情况下内存的使用情况:
初始化
ID COMMAND %CPU TIME #TH #WQ #POR MEM PURG CMPR PGRP PPID STATE BOOSTS
20746 httprouter 0.0 00:00.01 7 0 25 1720K 0B 0B 20746 1532 sleeping *0[1]
- 1
- 2
- 3
ab -n 6000 -c 100 http://127.0.0.1:8081/index
PID COMMAND %CPU TIME #TH #WQ #POR MEM PURG CMPR PGRP PPID STATE BOOSTS
20746 httprouter 0.0 00:02.05 20 0 38 7400K 0B 0B 20746 1532 sleeping *0[1]
- 1
- 2
- 3
- 4
ab -n 6000 -c 200 http://127.0.0.1:8081/index
ID COMMAND %CPU TIME #TH #WQ #POR MEM PURG CMPRS PGRP PPID STATE
20746 httprouter 0.0 00:04.14 20 0 38 9508K 0B 880K 20746 1532 sleeping
- 1
- 2
- 3
- 4
ab -n 6000 -c 300 http://127.0.0.1:8081/index
PID COMMAND %CPU TIME #TH #WQ #POR MEM PURG CMPRS PGRP PPID STATE
20746 httprouter 0.0 00:05.51 82 0 100 13M 0B 856K 20746 1532 sleeping
- 1
- 2
- 3
- 4
fasthttp 并发情况下内存的使用情况:
初始化
PID COMMAND %CPU TIME #TH #WQ #POR MEM PURG CMPR PGRP PPID STATE BOOSTS
20455 fasthttp 0.0 00:00.01 7 0 25 1704K 0B 0B 20455 1532 sleeping *0[1]
- 1
- 2
- 3
ab -n 6000 -c 100 http://127.0.0.1:8080/index
PID COMMAND %CPU TIME #TH #WQ #POR MEM PURG CMPR PGRP PPID STATE BOOSTS
20455 fasthttp 1.9 00:01.61 29 0 47+ 5964K+ 0B 0B 20455 1532 sleeping *0[1]
- 1
- 2
- 3
- 4
- 5
ab -n 6000 -c 200 http://127.0.0.1:8080/index
PID COMMAND %CPU TIME #TH #WQ #POR MEM PURG CMPR PGRP PPID STATE BOOSTS
20455 fasthttp 0.0 00:02.99 29 0 47 7136K 0B 0B 20455 1532 sleeping *0[1]
- 1
- 2
- 3
- 4
ab -n 6000 -c 300 http://127.0.0.1:8080/index
PID COMMAND %CPU TIME #TH #WQ #POR MEM PURG CMPR PGRP PPID STATE BOOSTS
20455 fasthttp 0.0 00:04.18 49 0 67 8508K 0B 0B 20455 1532 sleeping *0[1]
- 1
- 2
- 3
- 4
可能是因为程序只是简单的返回了 hello world ! 所以内存增长的并不明显,
但是httprouter 在并发到300的时候 内存飙升(一开始以为自己弄错了,测了几次还是这样的数据)可能是http没有做任何优化的原因
fasthttp做了优化,并发越大的情况下越能体现优势,所以个人更倾向于fasthttp
httprouter与 fasthttp 的性能对比的更多相关文章
- [原] KVM 环境下MySQL性能对比
KVM 环境下MySQL性能对比 标签(空格分隔): Cloud2.0 [TOC] 测试目的 对比MySQL在物理机和KVM环境下性能情况 压测标准 压测遵循单一变量原则,所有的对比都是只改变一个变量 ...
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)
如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...
- Java--Stream,NIO ByteBuffer,NIO MappedByteBuffer性能对比
目前Java中最IO有多种文件读取的方法,本文章对比Stream,NIO ByteBuffer,NIO MappedByteBuffer的性能,让我们知道到底怎么能写出性能高的文件读取代码. pack ...
- C正则库做DNS域名验证时的性能对比
C正则库做DNS域名验证时的性能对比 本文对C的正则库regex和pcre在做域名验证的场景下做评测. 验证DNS域名的正则表达式为: "^[0-9a-zA-Z_-]+(\\.[0-9a ...
- 开发语言性能对比,C++、Java、Python、LUA、TCC
一直想做开发语言性能对比,刚好有时间都做了给大家参考一下, 编译类:C++和Java表现还不错 脚本类:TCC脚本动态运行C语言,性能比其他脚本快好多... 想玩TCC的同学下载测试包,TCC目录下修 ...
- php+mysql预查询prepare 与普通查询的性能对比
prepare可以解决大访问量的网站给数据库服务器所带来的负载和开销,本文章通过实例向大家介绍预查询prepare与普通查询的性能对比,需要的朋友可以参考一下. 实例代码如下: <?php cl ...
- 不同Framework下StringBuilder和String的性能对比,及不同Framework性能比(附Demo)
本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 阅读目录 介绍 环境搭建 测试用例 MSDN说明 ...
- ArrayList和LinkedList的几种循环遍历方式及性能对比分析(转)
主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性能测试对比,根据ArrayList和LinkedList的源码实现分析性能结果,总结结论. 通过本文你可以 ...
- ArrayList和LinkedList的几种循环遍历方式及性能对比分析
最新最准确内容建议直接访问原文:ArrayList和LinkedList的几种循环遍历方式及性能对比分析 主要介绍ArrayList和LinkedList这两种list的五种循环遍历方式,各种方式的性 ...
随机推荐
- alexnet- tensorflow
alexnet 在 imagenet上夺冠是卷积神经网络如今这么火热的起点. 虽然卷积神经网络很早就被提出来,但是由于计算能力和各方面原因,没有得到关注. alexnet 为什么能取得这么好的成绩,它 ...
- DNN网络(一)
摘自 https://www.cnblogs.com/pinard/p/6418668.html 一.DNN 简介 1.DNN的层次可以分为三层 输入层(input layer) 隐藏层(hidden ...
- Sqlserver 连接oracle和mysql数据库 已经oracle导入sqlserver表数据
SQL Server2012创建连接服务器到ORACLE11G 8,百思考不知道原因啊??突然我发现如下:链接服务器—〉访问接口—〉OraOLEDB.Oracle—〉允许进程内没有勾上,但是我想上面的 ...
- Git学习之忽略特殊文件.gitignore的配置
1.Mac中使用Git上传项目代码时忽略.DS_Store文件 简单的说Mac每个目录都会有个文件叫.DS_Store,它是用于存储当前文件夹的一些Meta信息.所以每次查看Git目录的状态,如果没有 ...
- Restful API学习Day3 - DRF视图
视图 一.进化 class GenericView(APIView): """把视图中可能用到的配置和方法封装起来""" queryset ...
- 怎么从docker 内部去连接host 上的mysql
一般来说数据最好放在一个公共的地方,这样在多个docker 可以共享这些数据. 这篇文章就是讲怎么从docker 内部去连接host上的 mysql 数据库. 因为我的host 有public ip, ...
- 第26月第8天 android studio 国内
1. //东软信息学院 mirrors.neusoft.edu.cn 80 使用方法: 启动 Android SDK Manager ,打开主界面,依次选择「Tools」.「Options…」,弹 ...
- [kuangbin带你飞]专题一 简单搜索(回顾)
A - 棋盘问题 POJ - 1321 注意条件:不能每放一个棋子,就标记一行和一列,我们直接枚举每一行就可以了. AC代码: #include<iostream> #include< ...
- Tip:什么是JavaBean
可视化JavaBean 非可视化JavaBean(分:值JavaBean和工具JavaBean) JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参 ...
- scrapy基础 之 静态网页实例
1,scrapy爬虫基本流程: 1. 创建一个新的Scrapy Project > scrapy startproject 项目名称 #系统会在当前目录下创建一个项目名称命名的文件夹,其下 ...