From ec7cbbbc33e3d94c536363208c260e21790d1bf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Carlos=20Nieto?= <jose.carlos@menteslibres.net> Date: Sun, 26 Jul 2015 11:08:53 -0500 Subject: [PATCH] Adding benchmarks similar to those used for SQL databases. --- mongo/benchmark_test.go | 350 ++++++++++++++++++++++++++++++++++++++++ mongo/database_test.go | 70 -------- 2 files changed, 350 insertions(+), 70 deletions(-) create mode 100644 mongo/benchmark_test.go diff --git a/mongo/benchmark_test.go b/mongo/benchmark_test.go new file mode 100644 index 00000000..abd98082 --- /dev/null +++ b/mongo/benchmark_test.go @@ -0,0 +1,350 @@ +package mongo + +import ( + "fmt" + "gopkg.in/mgo.v2" + "gopkg.in/mgo.v2/bson" + "math/rand" + "testing" + + "upper.io/db" +) + +const ( + testRows = 1000 +) + +func updatedArtistN(i int) string { + return fmt.Sprintf("Updated Artist %d", i%testRows) +} + +func artistN(i int) string { + return fmt.Sprintf("Artist %d", i%testRows) +} + +func connectAndAddFakeRows() (db.Database, error) { + var err error + var sess db.Database + + if sess, err = db.Open(Adapter, settings); err != nil { + return nil, err + } + + driver := sess.Driver().(*mgo.Session) + + if err = driver.DB("").C("artist").DropCollection(); err != nil { + return nil, err + } + + for i := 0; i < testRows; i++ { + if err = driver.DB("").C("artist").Insert(bson.M{"name": artistN(i)}); err != nil { + return nil, err + } + } + + return sess, nil +} + +func BenchmarkMgoAppend(b *testing.B) { + var err error + var sess db.Database + + if sess, err = db.Open(Adapter, settings); err != nil { + b.Fatal(err) + } + + defer sess.Close() + + driver := sess.Driver().(*mgo.Session) + + if err = driver.DB("").C("artist").DropCollection(); err != nil { + b.Fatal(err) + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + if err = driver.DB("").C("artist").Insert(bson.M{"name": "Hayao Miyazaki"}); err != nil { + b.Fatal(err) + } + } +} + +// BenchmarkUpperAppend benchmarks an insertion by upper.io/db. +func BenchmarkUpperAppend(b *testing.B) { + + sess, err := db.Open(Adapter, settings) + if err != nil { + b.Fatal(err) + } + + defer sess.Close() + + artist, err := sess.Collection("artist") + if err != nil { + b.Fatal(err) + } + + artist.Truncate() + + item := struct { + Name string `bson:"name"` + }{"Hayao Miyazaki"} + + b.ResetTimer() + for i := 0; i < b.N; i++ { + if _, err = artist.Append(item); err != nil { + b.Fatal(err) + } + } +} + +// BenchmarkUpperAppendVariableArgs benchmarks an insertion by upper.io/db +// with variable parameters. +func BenchmarkUpperAppendVariableArgs(b *testing.B) { + + sess, err := db.Open(Adapter, settings) + if err != nil { + b.Fatal(err) + } + + defer sess.Close() + + artist, err := sess.Collection("artist") + if err != nil { + b.Fatal(err) + } + + artist.Truncate() + + b.ResetTimer() + for i := 0; i < b.N; i++ { + item := struct { + Name string `bson:"name"` + }{fmt.Sprintf("Hayao Miyazaki %d", rand.Int())} + if _, err = artist.Append(item); err != nil { + b.Fatal(err) + } + } +} + +// BenchmarkMgoSelect benchmarks MongoDB find queries. +func BenchmarkMgoSelect(b *testing.B) { + var err error + var sess db.Database + + if sess, err = connectAndAddFakeRows(); err != nil { + b.Fatal(err) + } + + defer sess.Close() + + driver := sess.Driver().(*mgo.Session) + + type artistType struct { + Name string `bson:"name"` + } + + var item artistType + + b.ResetTimer() + for i := 0; i < b.N; i++ { + if err = driver.DB("").C("artist").Find(bson.M{"name": artistN(i)}).One(&item); err != nil { + b.Fatal(err) + } + } +} + +// BenchmarkMgoSelect benchmarks MongoDB find queries. +func BenchmarkMgoSelectAll(b *testing.B) { + var err error + var sess db.Database + + if sess, err = connectAndAddFakeRows(); err != nil { + b.Fatal(err) + } + + defer sess.Close() + + driver := sess.Driver().(*mgo.Session) + + type artistType struct { + Name string `bson:"name"` + } + + var items []artistType + + b.ResetTimer() + for i := 0; i < b.N; i++ { + if err = driver.DB("").C("artist").Find(bson.M{"name": artistN(i)}).All(&items); err != nil { + b.Fatal(err) + } + } +} + +// BenchmarkUpperFind benchmarks upper.io/db's One method. +func BenchmarkUpperFind(b *testing.B) { + var err error + var sess db.Database + + if sess, err = connectAndAddFakeRows(); err != nil { + b.Fatal(err) + } + + defer sess.Close() + + artist, err := sess.Collection("artist") + if err != nil { + b.Fatal(err) + } + + type artistType struct { + Name string `bson:"name"` + } + + var item artistType + + b.ResetTimer() + for i := 0; i < b.N; i++ { + res := artist.Find(db.Cond{"name": artistN(i)}) + if err = res.One(&item); err != nil { + b.Fatal(err) + } + } +} + +// BenchmarkUpperFindAll benchmarks upper.io/db's All method. +func BenchmarkUpperFindAll(b *testing.B) { + var err error + var sess db.Database + + if sess, err = connectAndAddFakeRows(); err != nil { + b.Fatal(err) + } + + defer sess.Close() + + artist, err := sess.Collection("artist") + if err != nil { + b.Fatal(err) + } + + type artistType struct { + Name string `bson:"name"` + } + + var items []artistType + + b.ResetTimer() + for i := 0; i < b.N; i++ { + res := artist.Find(db.Or{ + db.Cond{"name": artistN(i)}, + db.Cond{"name": artistN(i + 1)}, + db.Cond{"name": artistN(i + 2)}, + }) + if err = res.All(&items); err != nil { + b.Fatal(err) + } + if len(items) != 3 { + b.Fatal("Expecting 3 results.") + } + } +} + +// BenchmarkMgoUpdate benchmarks MongoDB update queries. +func BenchmarkMgoUpdate(b *testing.B) { + var err error + var sess db.Database + + if sess, err = connectAndAddFakeRows(); err != nil { + b.Fatal(err) + } + + defer sess.Close() + + driver := sess.Driver().(*mgo.Session) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + if _, err = driver.DB("").C("artist").UpdateAll(bson.M{"name": artistN(i)}, bson.M{"$set": bson.M{"name": updatedArtistN(i)}}); err != nil { + b.Fatal(err) + } + } +} + +// BenchmarkUpperUpdate benchmarks upper.io/db's Update method. +func BenchmarkUpperUpdate(b *testing.B) { + var err error + var sess db.Database + + if sess, err = connectAndAddFakeRows(); err != nil { + b.Fatal(err) + } + + defer sess.Close() + + artist, err := sess.Collection("artist") + if err != nil { + b.Fatal(err) + } + + type artistType struct { + Name string `bson:"name"` + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + newValue := artistType{ + Name: updatedArtistN(i), + } + res := artist.Find(db.Cond{"name": artistN(i)}) + if err = res.Update(newValue); err != nil { + b.Fatal(err) + } + } +} + +// BenchmarkMgoDelete benchmarks MongoDB delete queries. +func BenchmarkMgoDelete(b *testing.B) { + var err error + var sess db.Database + + if sess, err = connectAndAddFakeRows(); err != nil { + b.Fatal(err) + } + + defer sess.Close() + + driver := sess.Driver().(*mgo.Session) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + if _, err = driver.DB("").C("artist").RemoveAll(bson.M{"name": artistN(i)}); err != nil { + b.Fatal(err) + } + } +} + +// BenchmarkUpperRemove benchmarks +func BenchmarkUpperRemove(b *testing.B) { + var err error + var sess db.Database + + if sess, err = connectAndAddFakeRows(); err != nil { + b.Fatal(err) + } + + defer sess.Close() + + artist, err := sess.Collection("artist") + if err != nil { + b.Fatal(err) + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + res := artist.Find(db.Cond{"name": artistN(i)}) + if err = res.Remove(); err != nil { + b.Fatal(err) + } + } +} diff --git a/mongo/database_test.go b/mongo/database_test.go index 14c4767e..a473ba22 100644 --- a/mongo/database_test.go +++ b/mongo/database_test.go @@ -31,7 +31,6 @@ import ( "testing" "time" - "gopkg.in/mgo.v2" "gopkg.in/mgo.v2/bson" "upper.io/db" ) @@ -957,72 +956,3 @@ func TestDataTypes(t *testing.T) { t.Errorf("Struct is different.") } } - -// Benchmarking raw mgo queries. -func BenchmarkAppendRaw(b *testing.B) { - sess, err := db.Open(Adapter, settings) - - if err != nil { - b.Fatal(err) - } - - defer sess.Close() - - artist, err := sess.Collection("artist") - artist.Truncate() - - driver := sess.Driver().(*mgo.Session) - - mgodb := driver.DB(database) - col := mgodb.C("artist") - - b.ResetTimer() - for i := 0; i < b.N; i++ { - err := col.Insert(map[string]string{"name": "Hayao Miyazaki"}) - if err != nil { - b.Fatal(err) - } - } -} - -func BenchmarkAppendDbItem(b *testing.B) { - sess, err := db.Open(Adapter, settings) - - if err != nil { - b.Fatal(err) - } - - defer sess.Close() - - artist, err := sess.Collection("artist") - artist.Truncate() - - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err = artist.Append(map[string]string{"name": "Leonardo DaVinci"}) - if err != nil { - b.Fatal(err) - } - } -} - -func BenchmarkAppendStruct(b *testing.B) { - sess, err := db.Open(Adapter, settings) - - if err != nil { - b.Fatal(err) - } - - defer sess.Close() - - artist, err := sess.Collection("artist") - artist.Truncate() - - b.ResetTimer() - for i := 0; i < b.N; i++ { - _, err = artist.Append(struct{ Name string }{"John Lennon"}) - if err != nil { - b.Fatal(err) - } - } -} -- GitLab