使用 mgo Bulk() 方法进行插入
func BenchmarkBulkInsert(b *testing.B) {
b.StopTimer()
// Database
dbs, err := mgo.Dial("mongodb://localhost/ac-bench")
if err != nil {
panic(err)
}
// Collections
uc := dbs.Clone().DB("").C("usersBenchmarkBulk")
defer dbs.Clone().DB("").Session.Close()
// Clear DB
uc.RemoveAll(bson.M{})
b.StartTimer()
for n := 0; n < b.N; n++ {
count := INSERT_COUNT
users := make([]interface{}, count) //必须定义成[]interface{}
for i := 0; i < count; i++ {
loop_user := User{}
loop_user.Init()
loop_user.Email = fmt.Sprintf("report-%d@example.com", i)
users[i] = loop_user
}
bulk := uc.Bulk()
bulk.Unordered()
bulk.Insert(users...)
_, bulkErr := bulk.Run()
if bulkErr != nil {
panic(err)
}
}
}
测试
go test -bench=".*" -cpu 1,2
BenchmarkFlatInsert 100 12281273 ns/op
BenchmarkFlatInsert-2 100 12981239 ns/op
BenchmarkParallelInsert 200 6963727 ns/op
BenchmarkParallelInsert-2 200 7948616 ns/op
BenchmarkBulkInsert 2000 1134782 ns/op
BenchmarkBulkInsert-2 2000 1072460 ns/op