Aorm:我不仅长得帅,功夫也挺好

234 阅读7分钟

Hi,各位Golang的小伙伴

前几天,我发布了一个新的数据库操作库/包,名字叫 Aorm,你们用上了吗?这可是目前肉眼可见的,最简单易用的查询库了

有些朋友有疑问,使用上简单当然很好,性能上怎么样啊?就像你男朋友,长得帅那挺好,功夫怎么样啊?

所以在一些朋友的建议下,我做了一些基本的性能对比测试。

测试环境

机器 windows 12th Gen Intel(R) Core(TM) i5-12400 2.50 GHz

golang版本 1.18

数据库 mysql 8.0

对比测试了哪些操作库呢

beego/orm v1.12.3

gorm v1.24.2

xorm v1.3.2

aorm v1.0.9

测试的代码

你可以在这个页面找到测试的代码

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。

项目地址如下,记得随手点个星星哦

github.com/tangpanqing…

Aorm是一个基于go语言得数据库操作库。

给个 ⭐ 吧,如果这个项目帮助到你