概述
当前已经有许多开源的 C/C++ 日志库, 本项目对一些知名或以低延时为目标的日志库做一个 Benchmark, 力求发现当面对如 MMORPG Server 或是金融交易系统这类低延时的场景下, 哪些日志库是较好的选择.
省流,将结果放在前面
提醒: 有一些图表之外需要注意的内容, 感兴趣的读者可在最后看到
日志库列表
此库对几个 C/C++ 日志库做 benchmark, 被测的库如下所示(按字母顺序排序)
Benchmark 说明
使用 google benchmark 进行测试, 测试分为两部分场景
[ol]
[/ol]
基准测试
测试日期: 2023-10-14
被测库版本, 详见: CMakeLists.txt
单次写入数据:
struct LogMsg {
uint64_t u64;
uint32_t u32;
int64_t i64;
int32_t i32;
char s[128];
};
日志输出格式:
${Level}|${datetime}|${filename}.${line_no}|${func_name}|${thread_id} - u64: msg.u64, i64: msg.i64, u32: msg.u32, i32: msg.i32, s: msg.s
测试机器
类型: 笔记本
机器: 20R10002CD ThinkPad X1 Carbon 7th
系统: Arch Linux x86_64
Kernel: 6.5.6-arch2-1
CPU: Intel i7-10710U (12) @ 4.700GHz
GPU: Intel Comet Lake UHD Graphics
Memory: 15659MiB
gcc: (GCC) 13.2.1 20230801
ldd: (GNU libc) 2.38
额外说明
由于我本地机器的测试中遇到一些问题, 导致 fmtlog, quill 和 reckless 没有做到测试场景完全的覆盖
由于个人水平所限, 若有错误和纰漏, 亦或是考虑欠妥之处, 还请不吝指正!
结果分析
通过上述图表不难看出
那么上面提到的这四个日志库为什么更快?他们有什么优劣势,以及使用中有什么要注意的坑呢?
以上 4 个日志库均为异步日志库, 设计上也都是多缓冲区队列写, 消费者负责轮询的模式, 整体思路相似, 代码细节各有各的趣味. 但作为用户来说, 有一点要特别注意
特别注意!!!
特别注意!!!
特别注意!!!
既然都使用了缓冲区, 那么就一定要考虑缓冲区被写满的情况, 此时有三种不同的应对方式
[ol]
[/ol]
haclog 与 Nanolog 选择了方案 1, fmtlog 可选方案 1/2, quill 可选方案 2/3
而由于 额外说明 中提到的情况, 导致 fmtlog 只可选择方案 2, quill 在 场景 1 中仅讨论 bounded 模式
fmtlog
优点
缺点
haclog
优点
缺点
Nanolog
优点
缺点
quill
优点
缺点
额外的一点考虑
haclog 使用纯 C 开发, 而 fmtlog, Nanolog 和 quill 采用 C++ 开发; 当就日志库这个场景来说, 理论上 C++ 实现速度上限会更高一点点, 表现为以下两个方面
日志前端序列化:
综上所述
可以看出, 当前这几个异步日志并没有一个能在全方位碾压其他日志库, 而是都在某一方面做了权衡取舍