目录
用于进行性能基准分析的代码可以在 GitHub 获取。
请注意性能基准分析只反映不同代码间的部分差异,且受到运行配置环境的影响,故可能与现实世界中的用例有所出入。欢迎贡献能提高模拟测试真实性和实践性的补丁。
处理 JSON 的性能表现
以下对 Z-Data 中的 JSON 模块和 Hackage 上被普遍使用的 JSON 处理软件包 aeson进行了基准性能分析。我们的分析结果可以参见这篇博客。
处理 TCP 的性能表现
以下通过使用 Redis 软件包中的工具 redis-benchmark
运行 redis-benchmark -p 8888 -t ping -n 100000 -q -c 100
来对不同 Redis 乒乓服务器实现进行了基准性能分析。
# Haskell 的 [network](https://hackage.haskell.org/package/network) 软件包
# cabal run redis-benchmark-base -- +RTS -N4 -H2G
PING_INLINE: 88105.73 requests per second
PING_BULK: 87873.46 requests per second
# Z.Haskell 的 Z-IO 软件包
# cabal run redis-benchmark-z -- +RTS -N4 -H2G
PING_INLINE: 99800.40 requests per second
PING_BULK: 102459.02 requests per second
# Golang 标准库
PING_INLINE: 98716.68 requests per second
PING_BULK: 101522.84 requests per second
# Rust mio
PING_INLINE: 111731.84 requests per second
PING_BULK: 112612.61 requests per second
# C libuv
PING_INLINE: 109170.30 requests per second
PING_BULK: 105374.08 requests per second
注意到 Rust 的 mio 和 C 的 libuv 都使用了单线程的事件循环和一个共享的缓冲区去接收来自 redis-benchmark
不同连接间的消息,和其它基于轻量线程的实现有较大不同。
以下是 GHC 提供的有关内存数据:
# Haskell 的 [network](https://hackage.haskell.org/package/network) 软件包
# cabal run redis-benchmark-base -- +RTS -N4 -s -H2G
3,751,313,096 bytes allocated in the heap
302,793,568 bytes copied during GC
1,869,864 bytes maximum residency (1044 sample(s))
490,016 bytes maximum slop
2085 MiB total memory in use (0 MB lost due to fragmentation)
Tot time (elapsed) Avg pause Max pause
Gen 0 2085 colls, 2085 par 0.455s 0.131s 0.0001s 0.0085s
Gen 1 1044 colls, 1043 par 0.419s 0.149s 0.0001s 0.0226s
Parallel GC work balance: 82.10% (serial 0%, perfect 100%)
TASKS: 10 (1 bound, 9 peak workers (9 total), using -N4)
SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)
INIT time 0.001s ( 0.001s elapsed)
MUT time 5.360s ( 5.842s elapsed)
GC time 0.874s ( 0.280s elapsed)
EXIT time 0.001s ( 0.008s elapsed)
Total time 6.236s ( 6.130s elapsed)
Alloc rate 699,915,737 bytes per MUT second
Productivity 85.9% of total user, 95.3% of total elapsed
# Z.Haskell 的 Z-IO 软件包
# cabal run redis-benchmark-z -- +RTS -N4 -s -H2G
280,828,448 bytes allocated in the heap
835,688 bytes copied during GC
3,375,112 bytes maximum residency (4 sample(s))
839,672 bytes maximum slop
2084 MiB total memory in use (0 MB lost due to fragmentation)
Tot time (elapsed) Avg pause Max pause
Gen 0 5 colls, 5 par 0.009s 0.008s 0.0015s 0.0073s
Gen 1 4 colls, 3 par 0.023s 0.021s 0.0052s 0.0194s
Parallel GC work balance: 82.81% (serial 0%, perfect 100%)
TASKS: 14 (1 bound, 13 peak workers (13 total), using -N4)
SPARKS: 0 (0 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)
INIT time 0.001s ( 0.001s elapsed)
MUT time 2.811s ( 6.757s elapsed)
GC time 0.032s ( 0.028s elapsed)
EXIT time 0.002s ( 0.004s elapsed)
Total time 2.846s ( 6.790s elapsed)
Alloc rate 99,903,441 bytes per MUT second
Productivity 98.8% of total user, 99.5% of total elapsed