Tlnet—性能压测数据 tlnet+gin+echo+原生http库


本文是http框架的基准压测数据,主要测试高并发情况下,各个http框架的路由性能,并分析压测数据

分别测试已经注册 url 与 未注册url 场景中,各个框架的性能和内存分配情况

压测程序地址

Tlnet Github

测试的库与框架分别是 Tlnet ,  Gin , Echo  , 原生http库
1. 已注册URL处理器,即能找到URL的场景,压测数据如下


2. 未注册URL处理器 ,即不能找到URL的场景,压测数据如下

基础测试性能指标
  1. 操作时间(ns/op):表示每次操作的平均时间,单位为纳秒。通常时间越短,代表性能越好。
  2. 内存分配(B/op):表示每次操作分配的平均内存大小,单位为字节。通常内存分配越少,代表资源占用越少。
  3. 分配次数(allocs/op):表示每次操作的平均内存分配次数。通常分配次数越少,代表资源占用越少。


压测数据说明:

第一个场景:已注册URL压测场景
  1. 操作时间(ns/op):
    1. Gin:在 410 - 550ns/op 之间波动
    2. Http(原生库):在 320 - 400ns/op 之间波动
    3. Tlnet:在 165 - 181ns/op 之间
    4. Echo:在 520 - 690ns/op 之间
  2. 内存分配(B/op):
    1. Gin:约为 1040
    2. Http(原生库):约为 344
    3. Tlnet:约为 288
    4. Echo:约为 1024
  3. 分配次数(allocs/op):
    1. Gin:9 次
    2. Http(原生库):9 次
    3. Tlnet:6 次
    4. Echo:10 次


第二个场景:未注册URL压测场景
  1. 操作时间(ns/op):
    1. Gin:在 445 - 469.6 ns/op 之间波动
    2. Http(原生库):在 820.9 - 901.8ns/op 之间波动
    3. Tlnet:在 178.2 - 199 ns/op 之间
    4. Echo:在 828.3 - 1002 ns/op 之间
  2. 内存分配(B/op):
    1. Gin:约为 992
    2. Http(原生库):约为 1200
    3. Tlnet:约为 288
    4. Echo:约为 1489
  3. 分配次数(allocs/op):
    1. Gin:8 次
    2. Http(原生库):19 次
    3. Tlnet:5 次
    4. 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的场景中,内存分配和分配次数都很低,这表明其内存优化策略有效,避免了频繁的对象创建和销毁。
  • HttpEcho 的内存分配在未注册URL场景中显著增加,表明它们在处理未匹配请求时会消耗更多内存资源。
4. 建议
  • Tlnet 在所有场景中的性能均远超其他框架,特别是在内存分配和操作时间方面表现出色,建议在对性能要求极高的场景下优先考虑。
  • Gin 性能表现较好,且在内存分配和操作时间上相对稳定,适合在对性能和灵活性要求较高的应用中使用。
  • 原生 Http 库虽然在简单场景中性能较优,但在复杂 URL 场景中会表现出性能下降和内存消耗增加,适合用于轻量化的应用。
  • Echo 在未注册 URL处理器的情况下表现比较差,建议在对高并发和内存要求较高的场景中进行优化使用。