github.com/kunlun-qilian/sqlx/v3@v3.0.0/scanner/struct_test.go (about) 1 package scanner 2 3 import ( 4 "context" 5 "testing" 6 7 "github.com/kunlun-qilian/sqlx/v3/scanner/nullable" 8 9 "github.com/DATA-DOG/go-sqlmock" 10 ) 11 12 func BenchmarkScanStruct(b *testing.B) { 13 db, mock, _ := sqlmock.New() 14 defer db.Close() 15 16 mockRows := mock.NewRows([]string{"f_i", "f_s"}) 17 18 b.Run("Direct", func(b *testing.B) { 19 target := &T2{} 20 _ = mock.ExpectQuery("SELECT .+ from t").WillReturnRows(mockRows) 21 22 rows, _ := db.Query("SELECT f_i,f_s from t") 23 24 for i := 0; i < b.N; i++ { 25 mockRows.AddRow(i, "a") 26 27 cs, _ := rows.Columns() 28 29 if rows.Next() { 30 dest := make([]interface{}, len(cs)) 31 crs := target.ColumnReceivers() 32 for i := range cs { 33 dest[i] = nullable.NewNullIgnoreScanner(crs[cs[i]]) 34 } 35 _ = rows.Scan(dest...) 36 } 37 } 38 39 b.Log(target) 40 }) 41 42 b.Run("Scan by reflect", func(b *testing.B) { 43 target := &T{} 44 _ = mock.ExpectQuery("SELECT .+ from t").WillReturnRows(mockRows) 45 46 rows, _ := db.Query("SELECT f_i,f_s from t") 47 48 for i := 0; i < b.N; i++ { 49 mockRows.AddRow(i, "b") 50 51 if rows.Next() { 52 _ = scanTo(context.Background(), rows, target) 53 } 54 } 55 56 b.Log(target) 57 }) 58 59 b.Run("Scan by column receivers", func(b *testing.B) { 60 target := &T2{} 61 _ = mock.ExpectQuery("SELECT .+ from t").WillReturnRows(mockRows) 62 63 rows, _ := db.Query("SELECT f_i,f_s from t") 64 65 for i := 0; i < b.N; i++ { 66 mockRows.AddRow(i, "c") 67 68 if rows.Next() { 69 _ = scanTo(context.Background(), rows, target) 70 } 71 } 72 73 b.Log(target) 74 }) 75 }