Go语言ORM库worm的性能测试

23 篇文章 1 订阅
13 篇文章 0 订阅

测试说明

本文对三种数据库访问包(sql.DB、worm、gorm)进行两种查询类型(获取单行数据、获取多行数据)的性能进行对比测试。另外为了使大家对预处理的性能有所了解,增加了worm开启预处理下的性能测试环节。worm的安装命令:go get github.com/haming123/wego/worm

数据库初始化函数

const dsn_test = "account:pwd@tcp(127.0.0.1:3306)/db?charset=utf8&parseTime=True"
func initMySql(cnnstr string) (*sql.DB, error) {
	dbcnn, err := sql.Open("mysql", cnnstr)
	if err != nil {
		return nil, err
	}
	err = dbcnn.Ping()
	if err != nil {
		return nil, err
	}
	return dbcnn, nil
}

单行数据查询性能测试

  • sql.DB.Query测试脚本
func BenchmarkDbQueryRow(b *testing.B) {
	dbcnn, _ := initMySql(dsn_test)
	b.StopTimer()

	b.StartTimer()
	for i := 0; i < b.N; i++ {
		var ent User
		rows, err := dbcnn.Query("select id,name,age from user where id=? limit 1", 1)
		if err != nil {
			b.Error(err)
			return
		}

		if !rows.Next() {
			b.Error(err)
			rows.Close()
			return
		}
		
		err = rows.Scan(&ent.DB_id, &ent.DB_name, &ent.Age)
		if err != nil {
			b.Error(err)
			rows.Close()
			return
		}
		rows.Close()
	}
	b.StopTimer()
}
  • worm.Get测试脚本
func BenchmarkModelGet(b *testing.B) {
	dbcnn, _ := initMySql(dsn_test)
	InitEngine(&dialectMysql{}, dbcnn)
	ShowSqlLog(false)
	b.StopTimer()

	b.StartTimer()
	for i := 0; i < b.N; i++ {
		var ent User
		_, err := Model(&ent).Where("id=?", 1).Select("id", "name", "age").Get()
		if err != nil{
			b.Error(err)
			return
		}
	}
	b.StopTimer()
}
  • gorm.First测试脚本
func BenchmarkModelGet(b *testing.B) {
	db, err := gorm.Open(mysql.Open(dsn_test), &gorm.Config{})
	if err != nil {
		b.Fatal(err)
	}
	b.StopTimer()

	b.StartTimer()
	for i := 0; i < b.N; i++ {
		var user User
		db.Where("id = ?",1).First(&user)
	}
	b.StopTimer()
}
  • worm.Get测试脚本(开启预处理)
func BenchmarkModelGetWithCache(b *testing.B) {
	dbcnn, _ := initMySql(dsn_test)
	InitEngine(&dialectMysql{}, dbcnn)
	ShowSqlLog(false)
	UsePrepare(true)
	b.StopTimer()

	b.StartTimer()
	for i := 0; i < b.N; i++ {
		var ent User
		_, err := Model(&ent).Where("id=?", 1).Select("id", "name", "age").Get()
		if err != nil{
			b.Error(err)
			return
		}
	}
	b.StopTimer()
}
  • 测试结果
pkg: sql.DB
BenchmarkDbQueryRow-2      	3547	    326038 ns/op	     899 B/op	      23 allocs/op
pkg: worm
BenchmarkModelGet-2      	3247	    352400 ns/op	    1932 B/op	      32 allocs/op
pkg: gorm
BenchmarkModelGet-2      	2780	    367584 ns/op	    4467 B/op	      73 allocs/op
pkg: worm(开启预处理)
BenchmarkGetWithCache-2     8248	    183477 ns/op	    1809 B/op	      29 allocs/op

多行数据查询性能测试

  • sql.DB.Query测试脚本
func BenchmarkDbQueryRows(b *testing.B) {
	dbcnn, _ := initMySql(dsn_test)
	b.StopTimer()

	b.StartTimer()
	var arr []User
	for i := 0; i < b.N; i++ {
		var ent User
		rows, err := dbcnn.Query("select id,name,age from user where id>? and name is not null", 0)
		if err != nil {
			b.Error(err)
			return
		}

		for rows.Next() {
			err = rows.Scan(&ent.DB_id, &ent.DB_name, &ent.Age)
			if err != nil {
				b.Error(err)
				rows.Close()
				return
			}
			arr = append(arr, ent)
		}
		rows.Close()
	}
	b.StopTimer()
}
  • worm.Find测试脚本
func BenchmarkModelFind(b *testing.B) {
	dbcnn, _ := initMySql(dsn_test)
	InitEngine(&dialectMysql{}, dbcnn)
	ShowSqlLog(false)
	b.StopTimer()

	b.StartTimer()
	for i := 0; i < b.N; i++ {
		var arr []User
		err := Model(&User{}).Where("id>? and name is not null", 0).Select("id", "name", "age").Find(&arr)
		if err != nil{
			b.Error(err)
			return
		}
	}
	b.StopTimer()
}
  • gorm.Find测试脚本
func BenchmarkModelFind(b *testing.B) {
	db, err := gorm.Open(mysql.Open(dsn_test), &gorm.Config{})
	if err != nil {
		b.Fatal(err)
	}
	b.StopTimer()

	b.StartTimer()
	for i := 0; i < b.N; i++ {
		var users []User
		db.Where("id>? and name is not null", 0).Find(&users)
	}
	b.StopTimer()
}
  • worm.Find测试脚本(开启预处理)
func BenchmarkModelFindWithCache(b *testing.B) {
	dbcnn, _ := initMySql(dsn_test)
	InitEngine(&dialectMysql{}, dbcnn)
	ShowSqlLog(false)
	UsePrepare(true)
	b.StopTimer()

	b.StartTimer()
	for i := 0; i < b.N; i++ {
		var arr []User
		err := Model(&User{}).Where("id>? and name is not null", 0).Select("id", "name", "age").Find(&arr)
		if err != nil{
			b.Error(err)
			return
		}
	}
	b.StopTimer()
}
  • 测试结果
pkg: sql.DB
BenchmarkDbQueryRows-2      3234	    429018 ns/op	    8361 B/op	      50 allocs/op
pkg: worm
BenchmarkModelFind-2   	    2562	    466247 ns/op	    5451 B/op	      79 allocs/op
pkg: gorm
BenchmarkModelFind-2   	    2342	    491657 ns/op	    9040 B/op	     239 allocs/op
pkg: worm(开启预处理)
BenchmarkFindWithCache-2    4662	    258889 ns/op	    5330 B/op	      76 allocs/op
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go lang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值