对比了 Google 的 zoekt 引擎,这款引擎在其他开源代码搜索引擎中性能相对较好。
数据:
- 小数据集:一个约 60 万行的代码仓库
- 大数据集:600+仓库,约 2000 万行代码,查询时分页取前 600 个结果
方法:
- 昆仑:使用 评测代码 cmd/benchmark/main.go,-runs=100 执行 100 次取平均
- zoekt:使用 zoekt-webserver,读取 footer 中的延迟,5 次取平均
- 分别测试了单串和正则两个类型的表达式
小数据集
搜索 "kafka":
昆仑:0.920 毫秒
zoekt:3.654 毫秒
搜索 "cpu.*cache":
昆仑:0.347 毫秒
zoekt:29.712 毫秒
搜索 "gc.*time":
昆仑:1.265 毫秒
zoekt:365.794 毫秒
大数据集
搜索 "kafka":
昆仑:1.208 毫秒
zoekt:13.595 毫秒
搜索 "cpu.*cache"
昆仑:4.222 毫秒
zoekt:45.980 毫秒
搜索 "gc.*time"
昆仑:41.275 毫秒
zoekt:4628 毫秒
由于采用了多种优化手段,相比竞品,昆仑对正则表达式的搜索速度提升在 10 倍以上,对于极端情况比如 "gc.*time" (gc 和 time 都是常见单词)提升可以在 100 倍。
对于简单字符串匹配,随着数据集的扩张(从 60 万到 2000 万行代码),昆仑的性能下降速度远低于数据集膨胀速度(从 0.920 毫秒 到 1.208 毫秒)。