go日志库性能基准压力测试:go-logger+slog+zap+log


本文主要在windows环境与linux环境下,分别对多个go日志库进行串行与并行压力测试,测试目的主要时对比各个库的内存分配占用与写日志效率。

压测程序与历次压测结果地址


一. Windows 环境

压测对象

  • go-logger   v0.27.0
  • go的log库   v1.23.2
  • zap   v1.27.0
  • go的slog库  v1.23.2
  • slog+go-logger 分别进行串行与并行基准压测

压测环境

  • 系统:Windows11
  • goarch: amd64
  • cpu: Intel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz

压测结果

  • go-logger在高并发环境中,性能大约为官方库与同类日志库性能的10倍,内存分配占用为同类日志库的几分之一


压测程序与历次压测结果地址


压测数据如下


压测数据统计1

日志记录器核心数操作次数每操作耗时(ns)内存分配(B)分配次数
Serial_NativeLog4598,4254,0952482
Serial_NativeLog8589,5264,2722482
Serial_Zap4485,1724,9433526
Serial_Zap8491,9104,8513536
Serial_GoLogger4527,4543,987802
Serial_GoLogger8574,3034,083802
Serial_Slog4498,5534,9523446
Serial_Slog8466,7434,9423446
Serial_SlogAndGoLogger4443,7985,1493446
Serial_SlogAndGoLogger8460,7625,2083446
Parallel_NativeLog4424,6815,1762482
Parallel_NativeLog8479,9885,0452482
Parallel_Zap4341,9376,7363526
Parallel_Zap8353,2476,5173536
Parallel_GoLogger44,240,8965491633
Parallel_GoLogger84,441,3885501283
Parallel_Slog4477,4234,9723446
Parallel_Slog8447,6425,0643446
Parallel_SlogAndGoLogger4424,8135,2423456
Parallel_SlogAndGoLogger8425,0705,2153456

压测数据统计2

测试类型并发数平均时间(ns/op)内存分配(B/op)内存分配次数(allocs/op)
NativeLogSerial439562482
840442482
Parallel449162482
850262482
ZapSerial448153526
849333536
Parallel467733526
866103536
GoLoggerSerial44010802
83966802
Parallel45681653
85761283
slogSerial449143446
849213446
Parallel449523446
850753446
slog + GoLoggerSerial450583446
850463446
Parallel451503456
852503456

性能分析

NativeLog(log库):
  • 串行性能: 具有相对较低的延迟(3956 ns/op 和 4044 ns/op),且内存占用较少(248 B/op)。
  • 并行性能: 在并发测试中,NativeLog 的性能也保持稳定,延迟(4916 ns/op 和 5026 ns/op)仍然低于其他库。
Zap(zap库):
  • 串行性能: Zap 的串行性能稍逊色于 log,延迟略高(4815 ns/op 和 4933 ns/op),并且内存占用较高(352 B/op)。
  • 并行性能: Zap 在并行测试中表现较差,延迟明显高于其他库,达到 6773 ns/op 和 6610 ns/op,显示出其在高并发情况下的瓶颈。
GoLogger(go-logger):
  • 串行性能: 在串行性能上表现良好,延迟(4010 ns/op 和 3966 ns/op),内存使用最低(80 B/op)。
  • 并行性能: 在并行测试中表现优异,延迟显著低于其他库,仅为 568.1 ns/op 和 576.0 ns/op,显示了其极高的并发处理能力。
slog(slog库):
  • 串行性能: slog 的串行性能在所有库中属于中等水平(4914 ns/op 和 4921 ns/op),内存占用相对较高(344 B/op)。
  • 并行性能: 在并行情况下,slog 的性能表现中规中矩(4952 ns/op 和 5075 ns/op)。
slog + GoLogger(slog+go-logger):
  • 串行性能: 当结合 slog 和 GoLogger 时,性能表现为(5058 ns/op 和 5046 ns/op),内存占用(344 B/op)与单独使用slog库相同。
  • 并行性能: 并行测试中,组合使用的性能(5150 ns/op 和 5250 ns/op)。


高并发场景中,go-logger的性能比同类型的日志库高10倍以上

在高并发场景中,go-logger 的性能显著优于其他日志库,尤其是在处理大量并发日志写入时。以下是根据基准测试数据,分析的各个日志库的性能:
库名并发性能(ns/op)内存分配(B/op)内存分配次数(allocs/op)备注
NativeLog4916 - 50262482Go自带日志库,性能中等
Zap6610 - 67733526性能一般,适合常规场景
GoLogger568 - 5761653极高性能,适合高并发场景
Slog4952 - 50753446性能一般,适合常规使用
SlogAndGoLogger5150 - 52503456与单独使用Slog类似

分析

  1. GoLogger(go-logger):
    • 在高并发环境下,其性能表现极为出色,延迟在 568.1 ns/op 和 576.0 ns/op 之间,耗时远低于其他库。
    • 内存分配显著更少(165 B/op),这意味着在高负载情况下能更有效地管理内存,减少GC压力。
  2. NativeLog(log):
    • 性能适中,延迟在 4916 ns/op 到 5026 ns/op 之间,内存分配较高(248 B/op),在高并发场景下可能导致性能下降。
  3. Zap(zap):
    • 性能较低,延迟在 6773 ns/op 到 6610 ns/op 之间,内存分配较多(352 B/op),适合普通使用场景。
  4. Slog(slog):
    • 性能一般,延迟在 4952 ns/op 到 5075 ns/op 之间,适合普通使用场景。
  5. SlogAndGoLogger(slog+go-logger):
    • 性能稍低于log,与单独使用slog类似,适合使用slog库并且需要管理日志文件的场景。



二 Linux环境

压测对象

  • go-logger   v0.27.0
  • go的log库   v1.23.2
  • zap   v1.27.0
  • go的slog库  v1.23.2
  • slog+go-logger 分别进行串行与并行基准压测


压测环境

  • 系统:Ubuntu 24.04.1 LTS
  • goarch: amd64
  • cpu: Intel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz


压测程序与历次压测结果地址


压测结果

  • linux环境,在高并发场景中,go-logger性能极为出色,压测数据显示,go-logger的性能比同类型日志库与官方日志库都高30倍以上
  • 即使在虚拟机环境,高并发情况下,go-logger的性能表现仍然可以达到常规环境下的基准性能标准。


说明:由于在虚拟机中压测,所有库的写数据性能都相应有所下降。该压测数据主要作用在于相对性能数据的比较。

性能分析表格

测试类型库名操作次数平均耗时 (ns/op)内存分配 (B/op)内存分配次数 (allocs/op)说明
串行日志记录NativeLog225791513402482go自带log库
Zap241241527543526zap
GoLogger25770148053802go-logger
Slog237521505663446slog
SlogAndGoLogger212731519303446slog+go-logger
并行日志记录NativeLog207941701862482go自带log库
Zap207931709153536zap
GoLogger74354048451283go-logger
Slog201751717763456slog
SlogAndGoLogger210151725073696slog+go-logger

结论

  1. 性能:在所有测试中,go-logger 在串行和并行日志记录中的平均耗时均优于其他库,尤其在并行情况下,其平均耗时仅为 4845 ns,显示出极强的处理能力和高效性。
  2. 内存使用效率高:go-logger 的内存分配量(80B)明显低于其他库(如 Zap 的 352 B),在处理相同日志记录时的内存占用显著减少,这有助于提升应用的整体性能。
  3. 高并发性能:在并行日志记录场景下,go-logger 的处理速度达到 743,540 次/秒,几乎是其他库的 30-40 倍,证明了其在高并发环境下的优秀表现,适合需要高性能日志记录的应用。



三 压测结论

go-logger 在Linux环境中,相对来说,有更好的性能表现。内存分配情况在windows环境与Linux环境是一致的。高并发场景中,在Linux环境,go-logger的性能是slog的30-40倍。而在windows环境,则是slog的10倍。

在高并发场景中,如果对性能要求较高的情况下,推荐使用 go-logger