Tlnet—性能压测数据 tlnet+gin+echo+原生http库
本文是http框架的基准压测数据,主要测试高并发情况下,各个http框架的路由性能,并分析压测数据
分别测试已经注册 url 与 未注册url 场景中,各个框架的性能和内存分配情况
压测程序地址
Tlnet Github
1. 已注册URL处理器,即能找到URL的场景,压测数据如下
2. 未注册URL处理器 ,即不能找到URL的场景,压测数据如下
基础测试性能指标
- 操作时间(ns/op):表示每次操作的平均时间,单位为纳秒。通常时间越短,代表性能越好。
- 内存分配(B/op):表示每次操作分配的平均内存大小,单位为字节。通常内存分配越少,代表资源占用越少。
- 分配次数(allocs/op):表示每次操作的平均内存分配次数。通常分配次数越少,代表资源占用越少。
压测数据说明:
第一个场景:已注册URL压测场景
- 操作时间(ns/op):
- Gin:在 410 - 550ns/op 之间波动
- Http(原生库):在 320 - 400ns/op 之间波动
- Tlnet:在 165 - 181ns/op 之间
- Echo:在 520 - 690ns/op 之间
- 内存分配(B/op):
- Gin:约为 1040
- Http(原生库):约为 344
- Tlnet:约为 288
- Echo:约为 1024
- 分配次数(allocs/op):
- Gin:9 次
- Http(原生库):9 次
- Tlnet:6 次
- Echo:10 次
第二个场景:未注册URL压测场景
- 操作时间(ns/op):
- Gin:在 445 - 469.6 ns/op 之间波动
- Http(原生库):在 820.9 - 901.8ns/op 之间波动
- Tlnet:在 178.2 - 199 ns/op 之间
- Echo:在 828.3 - 1002 ns/op 之间
- 内存分配(B/op):
- Gin:约为 992
- Http(原生库):约为 1200
- Tlnet:约为 288
- Echo:约为 1489
- 分配次数(allocs/op):
- Gin:8 次
- Http(原生库):19 次
- Tlnet:5 次
- Echo:16 次
分析与建议
1. 稳定性
在高并发情况下,无论请求URL是否能找到处理器 ,Gin与Tlnet在性能与内存分配上,都表现稳定。原生http库与echo在不同场景中,前后性能差异较大,内存分配呈现突然飙升的情况,性能也出现突然下降的情况。
2. 性能
在高并发情况下,
- Tlnet性能表现远胜于其他框架,这基于它缓存与树的路由优化算法实现。 无论哪个场景中,响应时间基本在 200ns/op 以下。它的性能几乎是Gin的3倍。内存消耗更是远远低于其他框架。
- Gin 性能表现较好且稳定,这基于它前缀树与内存优化算法实现。 无论哪个场景中,响应时间基本在 410ns/op - 550ns/op之间。
- 原生http库 性能表现较好,它直接采用最长路径匹配策略,比较轻量,在简单URL中,它性能出色,甚至很多情况下,性能要优于Gin;但在复杂URL场景中,或URL未能找到处理器的情况下,原生http库的性能会大幅下降,内存占用会大幅上升。
- Echo与原生http库有类似的情况,在URL未能找到处理器的情况下,性能突然下降,占用内存上升。
3. 内存分配分析:
- Tlnet 的内存分配和分配次数最少,表明tlnet使用了更高效的内存管理策略,尤其是在并发请求处理中减少了内存碎片和垃圾回收开销。
- Gin 的内存分配也较为节省,尤其是在已注册URL的场景中,内存分配和分配次数都很低,这表明其内存优化策略有效,避免了频繁的对象创建和销毁。
- Http 和 Echo 的内存分配在未注册URL场景中显著增加,表明它们在处理未匹配请求时会消耗更多内存资源。
4. 建议
- Tlnet 在所有场景中的性能均远超其他框架,特别是在内存分配和操作时间方面表现出色,建议在对性能要求极高的场景下优先考虑。
- Gin 性能表现较好,且在内存分配和操作时间上相对稳定,适合在对性能和灵活性要求较高的应用中使用。
- 原生 Http 库虽然在简单场景中性能较优,但在复杂 URL 场景中会表现出性能下降和内存消耗增加,适合用于轻量化的应用。
- Echo 在未注册 URL处理器的情况下表现比较差,建议在对高并发和内存要求较高的场景中进行优化使用。