2014-01-07 09:33:27 +00:00
package core
import (
2014-01-27 13:01:52 +00:00
"errors"
"fmt"
2014-01-25 02:07:11 +00:00
"os"
2014-01-07 09:33:27 +00:00
"testing"
_ "github.com/mattn/go-sqlite3"
)
var (
createTableSqlite3 = "CREATE TABLE IF NOT EXISTS `user` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NULL, `title` TEXT NULL, `age` FLOAT NULL, `alias` TEXT NULL, `nick_name` TEXT NULL);"
)
type User struct {
Id int64
Name string
Title string
Age float32
Alias string
NickName string
}
2014-01-25 14:29:40 +00:00
func BenchmarkOriQuery ( b * testing . B ) {
b . StopTimer ( )
2014-01-25 02:07:11 +00:00
os . Remove ( "./test.db" )
2014-01-07 09:33:27 +00:00
db , err := Open ( "sqlite3" , "./test.db" )
if err != nil {
2014-01-25 14:29:40 +00:00
b . Error ( err )
2014-01-07 09:33:27 +00:00
}
_ , err = db . Exec ( createTableSqlite3 )
if err != nil {
2014-01-25 14:29:40 +00:00
b . Error ( err )
2014-01-07 09:33:27 +00:00
}
2014-01-25 02:07:11 +00:00
for i := 0 ; i < 50 ; i ++ {
_ , err = db . Exec ( "insert into user (name, title, age, alias, nick_name) values (?,?,?,?,?)" ,
"xlw" , "tester" , 1.2 , "lunny" , "lunny xiao" )
if err != nil {
2014-01-25 14:29:40 +00:00
b . Error ( err )
2014-01-25 02:07:11 +00:00
}
}
2014-01-25 14:29:40 +00:00
b . StartTimer ( )
2014-01-25 02:07:11 +00:00
2014-01-25 14:29:40 +00:00
for i := 0 ; i < b . N ; i ++ {
rows , err := db . Query ( "select * from user" )
2014-01-25 02:07:11 +00:00
if err != nil {
2014-01-25 14:29:40 +00:00
b . Error ( err )
2014-01-25 02:07:11 +00:00
}
2014-01-25 14:29:40 +00:00
for rows . Next ( ) {
var Id int64
var Name , Title , Alias , NickName string
var Age float32
err = rows . Scan ( & Id , & Name , & Title , & Age , & Alias , & NickName )
if err != nil {
b . Error ( err )
}
//fmt.Println(Id, Name, Title, Age, Alias, NickName)
}
rows . Close ( )
}
2014-01-25 02:07:11 +00:00
}
2014-01-25 14:29:40 +00:00
func BenchmarkStructQuery ( b * testing . B ) {
b . StopTimer ( )
2014-01-25 02:07:11 +00:00
os . Remove ( "./test.db" )
db , err := Open ( "sqlite3" , "./test.db" )
if err != nil {
2014-01-25 14:29:40 +00:00
b . Error ( err )
2014-01-25 02:07:11 +00:00
}
_ , err = db . Exec ( createTableSqlite3 )
if err != nil {
2014-01-25 14:29:40 +00:00
b . Error ( err )
2014-01-25 02:07:11 +00:00
}
for i := 0 ; i < 50 ; i ++ {
_ , err = db . Exec ( "insert into user (name, title, age, alias, nick_name) values (?,?,?,?,?)" ,
"xlw" , "tester" , 1.2 , "lunny" , "lunny xiao" )
if err != nil {
2014-01-25 14:29:40 +00:00
b . Error ( err )
2014-01-25 02:07:11 +00:00
}
}
2014-01-25 14:29:40 +00:00
b . StartTimer ( )
2014-01-25 02:07:11 +00:00
2014-01-25 14:29:40 +00:00
for i := 0 ; i < b . N ; i ++ {
rows , err := db . Query ( "select * from user" )
2014-01-25 02:07:11 +00:00
if err != nil {
2014-01-25 14:29:40 +00:00
b . Error ( err )
2014-01-25 02:07:11 +00:00
}
2014-01-25 14:29:40 +00:00
for rows . Next ( ) {
var user User
err = rows . ScanStruct ( & user )
if err != nil {
b . Error ( err )
}
2014-01-27 13:01:52 +00:00
if user . Name != "xlw" {
fmt . Println ( user )
b . Error ( errors . New ( "name should be xlw" ) )
}
2014-01-25 14:29:40 +00:00
}
rows . Close ( )
2014-01-25 02:07:11 +00:00
}
}
2014-01-25 14:29:40 +00:00
func BenchmarkStruct2Query ( b * testing . B ) {
b . StopTimer ( )
2014-01-25 02:07:11 +00:00
os . Remove ( "./test.db" )
db , err := Open ( "sqlite3" , "./test.db" )
if err != nil {
2014-01-25 14:29:40 +00:00
b . Error ( err )
2014-01-25 02:07:11 +00:00
}
_ , err = db . Exec ( createTableSqlite3 )
if err != nil {
2014-01-25 14:29:40 +00:00
b . Error ( err )
2014-01-25 02:07:11 +00:00
}
for i := 0 ; i < 50 ; i ++ {
_ , err = db . Exec ( "insert into user (name, title, age, alias, nick_name) values (?,?,?,?,?)" ,
"xlw" , "tester" , 1.2 , "lunny" , "lunny xiao" )
if err != nil {
2014-01-25 14:29:40 +00:00
b . Error ( err )
2014-01-25 02:07:11 +00:00
}
}
2014-01-25 16:05:37 +00:00
db . Mapper = NewCacheMapper ( & SnakeMapper { } )
2014-01-25 14:29:40 +00:00
b . StartTimer ( )
2014-01-07 09:33:27 +00:00
2014-01-25 14:29:40 +00:00
for i := 0 ; i < b . N ; i ++ {
rows , err := db . Query ( "select * from user" )
2014-01-07 09:33:27 +00:00
if err != nil {
2014-01-25 14:29:40 +00:00
b . Error ( err )
2014-01-07 09:33:27 +00:00
}
2014-01-25 14:29:40 +00:00
for rows . Next ( ) {
var user User
err = rows . ScanStruct2 ( & user )
if err != nil {
b . Error ( err )
}
2014-01-27 13:01:52 +00:00
if user . Name != "xlw" {
fmt . Println ( user )
b . Error ( errors . New ( "name should be xlw" ) )
}
2014-01-25 14:29:40 +00:00
}
rows . Close ( )
2014-01-07 09:33:27 +00:00
}
2014-01-25 02:07:11 +00:00
}
2014-01-25 14:29:40 +00:00
func BenchmarkSliceQuery ( b * testing . B ) {
b . StopTimer ( )
2014-01-25 02:07:11 +00:00
os . Remove ( "./test.db" )
db , err := Open ( "sqlite3" , "./test.db" )
if err != nil {
2014-01-25 14:29:40 +00:00
b . Error ( err )
2014-01-25 02:07:11 +00:00
}
_ , err = db . Exec ( createTableSqlite3 )
if err != nil {
2014-01-25 14:29:40 +00:00
b . Error ( err )
2014-01-25 02:07:11 +00:00
}
for i := 0 ; i < 50 ; i ++ {
_ , err = db . Exec ( "insert into user (name, title, age, alias, nick_name) values (?,?,?,?,?)" ,
"xlw" , "tester" , 1.2 , "lunny" , "lunny xiao" )
if err != nil {
2014-01-25 14:29:40 +00:00
b . Error ( err )
2014-01-25 02:07:11 +00:00
}
}
2014-01-25 14:29:40 +00:00
b . StartTimer ( )
2014-01-25 02:07:11 +00:00
2014-01-25 14:29:40 +00:00
for i := 0 ; i < b . N ; i ++ {
rows , err := db . Query ( "select * from user" )
if err != nil {
b . Error ( err )
}
cols , err := rows . Columns ( )
if err != nil {
b . Error ( err )
}
2014-01-25 02:07:11 +00:00
2014-01-25 14:29:40 +00:00
for rows . Next ( ) {
slice := make ( [ ] interface { } , len ( cols ) )
err = rows . ScanSlice ( & slice )
if err != nil {
b . Error ( err )
}
2014-01-27 13:01:52 +00:00
if slice [ 1 ] . ( string ) != "xlw" {
fmt . Println ( slice )
b . Error ( errors . New ( "name should be xlw" ) )
}
2014-01-25 14:29:40 +00:00
}
rows . Close ( )
}
}
func BenchmarkMapInterfaceQuery ( b * testing . B ) {
b . StopTimer ( )
os . Remove ( "./test.db" )
db , err := Open ( "sqlite3" , "./test.db" )
2014-01-25 02:07:11 +00:00
if err != nil {
2014-01-25 14:29:40 +00:00
b . Error ( err )
2014-01-25 02:07:11 +00:00
}
2014-01-25 14:29:40 +00:00
_ , err = db . Exec ( createTableSqlite3 )
if err != nil {
b . Error ( err )
}
2014-01-25 02:07:11 +00:00
2014-01-25 14:29:40 +00:00
for i := 0 ; i < 50 ; i ++ {
_ , err = db . Exec ( "insert into user (name, title, age, alias, nick_name) values (?,?,?,?,?)" ,
"xlw" , "tester" , 1.2 , "lunny" , "lunny xiao" )
2014-01-25 02:07:11 +00:00
if err != nil {
2014-01-25 14:29:40 +00:00
b . Error ( err )
2014-01-25 02:07:11 +00:00
}
}
2014-01-25 14:29:40 +00:00
b . StartTimer ( )
for i := 0 ; i < b . N ; i ++ {
rows , err := db . Query ( "select * from user" )
if err != nil {
b . Error ( err )
}
for rows . Next ( ) {
m := make ( map [ string ] interface { } )
err = rows . ScanMap ( & m )
if err != nil {
b . Error ( err )
}
2014-01-27 13:01:52 +00:00
if m [ "name" ] . ( string ) != "xlw" {
fmt . Println ( m )
b . Error ( errors . New ( "name should be xlw" ) )
}
2014-01-25 14:29:40 +00:00
}
rows . Close ( )
}
2014-01-25 02:07:11 +00:00
}
2014-01-25 14:29:40 +00:00
func BenchmarkMapBytesQuery ( b * testing . B ) {
b . StopTimer ( )
2014-01-25 02:07:11 +00:00
os . Remove ( "./test.db" )
db , err := Open ( "sqlite3" , "./test.db" )
if err != nil {
2014-01-25 14:29:40 +00:00
b . Error ( err )
2014-01-25 02:07:11 +00:00
}
_ , err = db . Exec ( createTableSqlite3 )
if err != nil {
2014-01-25 14:29:40 +00:00
b . Error ( err )
2014-01-25 02:07:11 +00:00
}
for i := 0 ; i < 50 ; i ++ {
_ , err = db . Exec ( "insert into user (name, title, age, alias, nick_name) values (?,?,?,?,?)" ,
"xlw" , "tester" , 1.2 , "lunny" , "lunny xiao" )
if err != nil {
2014-01-25 14:29:40 +00:00
b . Error ( err )
2014-01-25 02:07:11 +00:00
}
}
2014-01-25 14:29:40 +00:00
b . StartTimer ( )
for i := 0 ; i < b . N ; i ++ {
rows , err := db . Query ( "select * from user" )
if err != nil {
b . Error ( err )
}
for rows . Next ( ) {
m := make ( map [ string ] [ ] byte )
err = rows . ScanMap ( & m )
if err != nil {
b . Error ( err )
}
2014-01-27 13:01:52 +00:00
if string ( m [ "name" ] ) != "xlw" {
fmt . Println ( m )
b . Error ( errors . New ( "name should be xlw" ) )
}
2014-01-25 14:29:40 +00:00
}
rows . Close ( )
2014-01-25 02:07:11 +00:00
}
2014-01-25 14:29:40 +00:00
}
2014-01-25 02:07:11 +00:00
2014-01-25 14:29:40 +00:00
func BenchmarkMapStringQuery ( b * testing . B ) {
b . StopTimer ( )
os . Remove ( "./test.db" )
db , err := Open ( "sqlite3" , "./test.db" )
if err != nil {
b . Error ( err )
}
2014-01-25 02:07:11 +00:00
2014-01-25 14:29:40 +00:00
_ , err = db . Exec ( createTableSqlite3 )
if err != nil {
b . Error ( err )
}
2014-01-25 02:07:11 +00:00
2014-01-25 14:29:40 +00:00
for i := 0 ; i < 50 ; i ++ {
_ , err = db . Exec ( "insert into user (name, title, age, alias, nick_name) values (?,?,?,?,?)" ,
"xlw" , "tester" , 1.2 , "lunny" , "lunny xiao" )
2014-01-25 02:07:11 +00:00
if err != nil {
2014-01-25 14:29:40 +00:00
b . Error ( err )
2014-01-25 02:07:11 +00:00
}
}
2014-01-25 14:29:40 +00:00
b . StartTimer ( )
for i := 0 ; i < b . N ; i ++ {
rows , err := db . Query ( "select * from user" )
if err != nil {
b . Error ( err )
}
for rows . Next ( ) {
m := make ( map [ string ] string )
err = rows . ScanMap ( & m )
if err != nil {
b . Error ( err )
}
2014-01-27 13:01:52 +00:00
if m [ "name" ] != "xlw" {
fmt . Println ( m )
b . Error ( errors . New ( "name should be xlw" ) )
}
2014-01-25 14:29:40 +00:00
}
rows . Close ( )
}
2014-01-07 09:33:27 +00:00
}