Hi,各位Golang的小伙伴
前几天,我发布了一个新的数据库操作库/包,名字叫 Aorm
,你们用上了吗?这可是目前肉眼可见的,最简单易用的查询库了
有些朋友有疑问,使用上简单当然很好,性能上怎么样啊?就像你男朋友,长得帅那挺好,功夫怎么样啊?
所以在一些朋友的建议下,我做了一些基本的性能对比测试。
测试环境
机器 windows 12th Gen Intel(R) Core(TM) i5-12400 2.50 GHz
golang版本 1.18
数据库 mysql 8.0
对比测试了哪些操作库呢
测试的代码
你可以在这个页面找到测试的代码
tangpanqing/orm-benchmark (github.com)
测试的结果
4000 times - Insert
xorm: 3.25s 812484 ns/op 1666 B/op 48 allocs/op
gorm_stmt: 3.35s 837466 ns/op 2195 B/op 42 allocs/op
beego: 3.35s 838498 ns/op 905 B/op 36 allocs/op
raw_stmt: 3.46s 866242 ns/op 288 B/op 10 allocs/op
gorm: 3.54s 883939 ns/op 2413 B/op 45 allocs/op
aorm: 3.55s 886341 ns/op 1721 B/op 72 allocs/op
raw: 3.58s 895178 ns/op 505 B/op 12 allocs/op
4000 times - MultiInsert 100 row
raw_stmt: 5.85s 1462246 ns/op 65887 B/op 511 allocs/op
gorm_stmt: 6.15s 1537828 ns/op 80831 B/op 1138 allocs/op
beego: 6.53s 1632810 ns/op 91343 B/op 1435 allocs/op
raw: 6.70s 1675391 ns/op 88166 B/op 514 allocs/op
gorm: 6.98s 1744611 ns/op 101320 B/op 1140 allocs/op
xorm: 7.28s 1820212 ns/op 155224 B/op 2850 allocs/op
aorm: doesn't work
4000 times - Update
raw_stmt: 0.10s 25554 ns/op 304 B/op 10 allocs/op
beego: 0.14s 35880 ns/op 880 B/op 36 allocs/op
gorm_stmt: 0.17s 41283 ns/op 2656 B/op 55 allocs/op
raw: 0.21s 52570 ns/op 536 B/op 12 allocs/op
xorm: 0.25s 62027 ns/op 1665 B/op 85 allocs/op
gorm: 0.25s 63400 ns/op 2888 B/op 57 allocs/op
aorm: 0.27s 67571 ns/op 1929 B/op 85 allocs/op
4000 times - Read
raw_stmt: 0.11s 27649 ns/op 833 B/op 32 allocs/op
beego: 0.13s 31841 ns/op 1616 B/op 88 allocs/op
gorm_stmt: 0.14s 34574 ns/op 2261 B/op 66 allocs/op
raw: 0.22s 54177 ns/op 897 B/op 35 allocs/op
aorm: 0.23s 57623 ns/op 1929 B/op 86 allocs/op
gorm: 0.24s 59979 ns/op 2325 B/op 69 allocs/op
xorm: 0.33s 83659 ns/op 5901 B/op 226 allocs/op
4000 times - MultiRead limit 100
raw_stmt: 0.66s 166103 ns/op 21152 B/op 1020 allocs/op
raw: 0.72s 180008 ns/op 26736 B/op 1509 allocs/op
beego: 1.16s 291017 ns/op 51738 B/op 3783 allocs/op
gorm_stmt: 1.20s 299639 ns/op 31598 B/op 2059 allocs/op
aorm: 1.21s 303194 ns/op 61705 B/op 3057 allocs/op
gorm: 1.34s 335818 ns/op 31661 B/op 2062 allocs/op
xorm: doesn't work
更多对比测试结果,可以从这个页面看到更多
orm-benchmark/results.md at master · tangpanqing/orm-benchmark (github.com)
可能有一些朋友看不懂这个测试报告,我来解释下。
raw_stmt: 0.66s 166103 ns/op 21152 B/op 1020 allocs/op
raw: 0.72s 180008 ns/op 26736 B/op 1509 allocs/op
beego: 1.16s 291017 ns/op 51738 B/op 3783 allocs/op
gorm_stmt: 1.20s 299639 ns/op 31598 B/op 2059 allocs/op
aorm: 1.21s 303194 ns/op 61705 B/op 3057 allocs/op
gorm: 1.34s 335818 ns/op 31661 B/op 2062 allocs/op
类似于上面的5列
第一列表示各库的名字
第二列表示整体运行时间,单位秒,该值越小越好
第三列表示每个操作所需要的时间,单位纳秒,该值越小越好
第四列表示每个操作分配了多少字节,该值越小越好
第五列表示每个操作发生了多少个不同的内存分配,该值越小越好
分析结果
现在进入找茬时间
首先看 4000 times - Insert
xorm: 3.25s 812484 ns/op 1666 B/op 48 allocs/op
gorm_stmt: 3.35s 837466 ns/op 2195 B/op 42 allocs/op
beego: 3.35s 838498 ns/op 905 B/op 36 allocs/op
raw_stmt: 3.46s 866242 ns/op 288 B/op 10 allocs/op
gorm: 3.54s 883939 ns/op 2413 B/op 45 allocs/op
aorm: 3.55s 886341 ns/op 1721 B/op 72 allocs/op
raw: 3.58s 895178 ns/op 505 B/op 12 allocs/op
进行4000次写入操作,耗时最小的是3.25,最大的是3.58, 可以看到,各框架相差不大。
原因也很简单,他们都要写入到数据库,然后保存到系统磁盘。在这个过程中,落盘的时间起决定作用,各框架实现方法的影响对于结果的影响比较小。
这里有一点小问题需要注意,raw的时间竟然垫底,它可是使用的原生的操作啊,也就是说没有使用任何反射的情况下,说明数据有些许的失真。不过不足以影响上述判断。
接着看 4000 times - Update
raw_stmt: 0.10s 25554 ns/op 304 B/op 10 allocs/op
beego: 0.14s 35880 ns/op 880 B/op 36 allocs/op
gorm_stmt: 0.17s 41283 ns/op 2656 B/op 55 allocs/op
raw: 0.21s 52570 ns/op 536 B/op 12 allocs/op
xorm: 0.25s 62027 ns/op 1665 B/op 85 allocs/op
gorm: 0.25s 63400 ns/op 2888 B/op 57 allocs/op
aorm: 0.27s 67571 ns/op 1929 B/op 85 allocs/op
进行4000次更新操作,耗时最小的是0.10,最大的是0.27, 看上去差别挺大,其实应该分开看。
raw_stmt 使用的是原始的,也就是说没有使用任何反射的情况下,效率当然高,没有问题。
beego 的orm使用的有模型缓存,以空间换时间,所以效率也高一些,不意外。
主要看最后三个,时间上都差不多。
接着看 4000 times - Read
注意,这里是单读取一条
raw_stmt: 0.11s 27649 ns/op 833 B/op 32 allocs/op
beego: 0.13s 31841 ns/op 1616 B/op 88 allocs/op
gorm_stmt: 0.14s 34574 ns/op 2261 B/op 66 allocs/op
raw: 0.22s 54177 ns/op 897 B/op 35 allocs/op
aorm: 0.23s 57623 ns/op 1929 B/op 86 allocs/op
gorm: 0.24s 59979 ns/op 2325 B/op 69 allocs/op
xorm: 0.33s 83659 ns/op 5901 B/op 226 allocs/op
进行4000次读取操作,耗时最小的是0.11,最大的是0.33.
和4000次更新操作的分析差不多。
最后看 4000 times - MultiRead limit 100
注意这里每次读100条
raw_stmt: 0.66s 166103 ns/op 21152 B/op 1020 allocs/op
raw: 0.72s 180008 ns/op 26736 B/op 1509 allocs/op
beego: 1.16s 291017 ns/op 51738 B/op 3783 allocs/op
gorm_stmt: 1.20s 299639 ns/op 31598 B/op 2059 allocs/op
aorm: 1.21s 303194 ns/op 61705 B/op 3057 allocs/op
gorm: 1.34s 335818 ns/op 31661 B/op 2062 allocs/op
xorm: doesn't work
进行4000次批量读取工作,耗时最小的是0.66,最大的是1.34,这里最令我高兴的是,aorm的读取时间优于gorm。
多数互联网应用都是读操作多于写操作,读的性能至关重要,在这里aorm比gorm优秀,也坚定了我换掉gorm的想法。
总结
经过这些基本的性能测试,我对自己的Aorm
更有信心了。也欢迎各位同学使用,提提建议,提提Bug。
项目地址如下,记得随手点个星星哦
Aorm是一个基于go语言得数据库操作库。
给个 ⭐ 吧,如果这个项目帮助到你