Xlog Benchmark
Xlog
首先说一下为什么拿 LOG4CPP 做比较:
- 同是 C++ 所写的日志组件,语言上性能应该相近,都可以做到跨平台
- LOG4CPP 是一个优秀的框架
仔细分析两个日志框架的原理可以看出,内部实现有诸多不同,不能简单的直接拿来做比较, Xlog 考虑到移动终端的特点,会对日志进行压缩,而 LOG4CPP 诞生时移动互联网的时代还没到来,主要是为 PC 而做的一套框架(下面所有测试 LOG4CPP 选用的是 RollingFileAppender, 和 Xlog 每天一个日志文件的功能类似)。 综合以上考虑我通过两种情况去做了比较(需要注意的是不同的时间相同的机型同样的案例测试结果可能有变化):
Xlog 去掉压缩加密部分,和 LOG4CPP 放在同一个起点上对比, 每条日志为长度为 100 的随机字符串。详细数据如下:
测试时间:2016-12-31
1w 条日志耗时 | 1w条日志大小 | 10w 条日志耗时 | 10w条日志大小 | |
---|---|---|---|---|
iPhone 6s 使用 xlog | 115 ms | 1.9 M | 1155 ms | 19 M |
iPhone 6s 使用 log4cpp | 329 ms | 1.4 M | 3252 ms | 13.8 M |
HUAWEI MATE 8 使用 xlog | 452 ms | 1.5 M | 4685 ms | 15.4 M |
HUAWEI MATE 8 使用 log4cpp | 581 ms | 1.38 M | 6249 ms | 13.8 M |
SAMSUNG GT-I9500 使用 xlog | 1130 ms | 1.5 M | 13997 ms | 19.5 M |
SAMSUNG GT-I9500 使用 log4cpp | 4148 ms | 1.4 M | 46631 ms | 13.8 M |
Motorola Nexus 6 使用 xlog | 1300 ms | 1.5 M | 12328 ms | 15 M |
Motorola Nexus 6 使用 log4cpp | 3848 ms | 1.3 M | 36110 ms | 14 M |
测试时间:2017-06-06
1w 条日志耗时 | 1w条日志大小 | 10w 条日志耗时 | 10w条日志大小 | init 耗时 | |
---|---|---|---|---|---|
iPhone 6s 使用 xlog | 116 ms | 1.9 M | 1127 ms | 19 M | 10 ms |
iPhone 6s 使用 log4cpp | 486 ms | 1.4 M | 4867 ms | 13.8 M | 2 ms |
HUAWEI MATE 8 使用 xlog | 437 ms | 1.6 M | 4303 ms | 16.1 M | 1 ms |
HUAWEI MATE 8 使用 log4cpp | 588 ms | 1.45 M | 5981 ms | 14.5 M | 1 ms |
SAMSUNG GT-I9500 使用 xlog | 机器损坏 | - | - | - | - |
SAMSUNG GT-I9500 使用 log4cpp | 机器损坏 | - | - | - | - |
Motorola Nexus 6 使用 xlog | 2130 ms | 1.5 M | 21930 ms | 15 M | 9 ms |
Motorola Nexus 6 使用 log4cpp | 7372 ms | 1.3 M | 63166 ms | 14 M | 3 ms |
从上面的数据其实就能看出来 iPhone 和华为的机器的存储做的要比其他几个厂家要优秀。这里可能会有人有疑问,为什么两个组件都不压缩,产生的日志大小差别这么大,这里就需要看一下两个组件打的日志内容:
2016-12-31 12:24:19,579 [4485227456] WARN - KRCJTDMXOUSBBEXAMPTZGBXRYMKHPYHWDOZIICGGMYDASYCERVWFIEIOUYAPWXGAYSOJDWADFRXPJPEMMTYMGEBASRNLRRPTXTBR
上面的是 LOG4CPP 打的日志,包括时间、线程名、日志级别、日志内容。 再看下面是 Xlog 打的日志,不仅包含 LOG4CPP 有的所有东西,还增加了进程名、 TAG、文件名、函数名、行号。如果想让 LOG4CPP 增加这些信息,并没有那么简单,因为 Xlog 打印日志的接口是宏,很容易获取到这些信息,但是 LOG4CPP 打印日志的接口是函数。
[I][2016-12-31 +8.0 12:24:19.793][45420, 106652628366400*][][ViewController.mm, viewDidLoad, 86][JDCIKXWEKOFNKEOPRYCYGGGCKXAJRRQRABREHRZLOHMWKLEAFGVJPJSVKPGVPQBQJXWYOAZZSJIPMUNTRTATYVXQZUFGVNUZVLMO
Xlog 默认的实现(带有压缩),和 LOG4CPP 对比, 每条日志为长度为 100 的随机字符串。测试时间:2016-12-31,详细数据如下:
1w 条日志耗时 | 1w条日志大小 | 10w 条日志耗时 | 10w条日志大小 | |
---|---|---|---|---|
iPhone 6s 使用 xlog | 420 ms | 955 K | 4175 ms | 9.3 M |
iPhone 6s 使用 log4cpp | 331 ms | 1.4 M | 3236 ms | 13.8 M |
HUAWEI MATE 8 使用 xlog | 755 ms | 1 M | 7585 ms | 10 M |
HUAWEI MATE 8 使用 log4cpp | 606 ms | 1.4 M | 6356 ms | 14 M |
SAMSUNG GT-I9500 使用 xlog | 1972 ms | 1 M | 18489 ms | 10.4 M |
SAMSUNG GT-I9500 使用 log4cpp | 4743 ms | 1.3 M | 47944 ms | 13.8 M |
Motorola Nexus 6 使用 xlog | 1825 ms | 1 M | 17831 ms | 10 M |
Motorola Nexus 6 使用 log4cpp | 3776 ms | 1.3 M | 36359 ms | 14 M |
Xlog 默认的实现(带有压缩和加密),和 LOG4CPP 对比, 每条日志为长度为 100 的随机字符串。测试时间:2017-06-06,详细数据如下:
1w 条日志耗时 | 1w条日志大小 | 10w 条日志耗时 | 10w条日志大小 | init 耗时 | |
---|---|---|---|---|---|
iPhone 6s 使用 xlog | 430 ms | 956 K | 4348 ms | 9.3 M | 19 ms |
iPhone 6s 使用 log4cpp | 487 ms | 1.4 M | 4892 ms | 13.8 M | 2 ms |
HUAWEI MATE 8 使用 xlog | 753 ms | 1 M | 7593 ms | 10 M | 5 ms |
HUAWEI MATE 8 使用 log4cpp | 596 ms | 1.4 M | 5988 ms | 14 M | 2 ms |
SAMSUNG GT-I9500 使用 xlog | 机器损坏 | - | - | - | - |
SAMSUNG GT-I9500 使用 log4cpp | 机器损坏 | - | - | - | - |
Motorola Nexus 6 使用 xlog | 2832 ms | 1 M | 27288 ms | 11 M | 20 ms |
Motorola Nexus 6 使用 log4cpp | 5963 ms | 1.3 M | 63588 ms | 14 M | 3ms |
单从耗时上看的话, Xlog 在 iPhone 和 Mate 8 上面是比不过 LOG4CPP 的,这里其实是因为这两个厂家的存储做的都很优秀,即使直接写文件,性能也不算很差,而 Xlog 压缩日志也需要一部分时间。
其他厂家,Xlog 是完胜 LOG4CPP。可能会有人觉得 Xlog 使用压缩后两个日志大小也并没有差别很大。熟悉 LZ77 压缩算法的人应该知道,这种随机字符串可压缩率极低,而应用中的日志大部分都是比较容易重复的字符串。在微信中使用 Xlog 的压缩率是 83%(即 100 M文件可以压缩为 17 M)。
即使在 Mate 8 上耗时 LOG4CPP 短于 Xlog, 我依然不推荐使用 LoG4CPP。不只是因为 LOG4CPP 会占用用户更多的存储空间,还因为哪怕存储做的再优秀,当系统给 write 的缓存占用内存超过 dirty_ratio 会直接阻塞写入的线程,如果非 UI 线程可能还好,UI 线程的话会表现为卡顿。
接口易用上 Xlog 比 LOG4CPP 方便很多, 但因为 Xlog 接口处大量使用了宏,可读性上应该是没有 LOG4CPP 强。
通过上面的对比,可以发现 Xlog 是更适合移动 App 环境使用的。Xlog 的耗时在长尾型的机器覆盖中更有优势,且针对移动环境对用户额外存储占用更少量的原则,通过压缩实际应用中可以有比较高的日志空间优化。 但是在扩展性上面, LOG4CPP 是优秀于 Xlog 的,只是大家思考下,类似远程的 appender 这种,客户端需要吗。Xlog 并不是不能做这些扩展,只是考虑了移动端是否需要这些扩展。
希望大家继续关注 Xlog,继续关注 Mars,微信开源愿与大家一起成长,谢谢大家。
更多的使用范例,大家请仔细阅读Sample。使用过程中有任何问题或建议,欢迎联系我们!