From f37dad3107c63868dbc5f935eda83b8aad712c99 Mon Sep 17 00:00:00 2001 From: Jan Mercl <0xjnml@gmail.com> Date: Fri, 8 Jan 2021 18:37:35 +0100 Subject: [PATCH] add BenchmarkInsertComparative, updates #39. --- cgo_test.go | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 2 deletions(-) diff --git a/cgo_test.go b/cgo_test.go index 9337bd3..ba5de31 100644 --- a/cgo_test.go +++ b/cgo_test.go @@ -38,7 +38,7 @@ func makename(inMemory bool, driver string, e int) string { return fmt.Sprintf("%s1e%d", name, e) } -func reading1Memory(b *testing.B, drivername, file string, n int) { +func benchmarkRead(b *testing.B, drivername, file string, n int) { os.Remove(file) db, err := sql.Open(drivername, file) if err != nil { @@ -112,7 +112,87 @@ func BenchmarkReading1(b *testing.B) { for _, driver := range drivers { for i, n := range []int{1e1, 1e2, 1e3, 1e4, 1e5, 1e6} { b.Run(makename(memory, driver, i+1), func(b *testing.B) { - reading1Memory(b, driver, filename, n) + benchmarkRead(b, driver, filename, n) + if !memory { + err := os.Remove(filename) + if err != nil { + b.Fatal(err) + } + } + }) + } + } + } +} + +func benchmarkInsertComparative(b *testing.B, drivername, file string, n int) { + os.Remove(file) + db, err := sql.Open(drivername, file) + if err != nil { + b.Fatal(err) + } + + defer func() { + db.Close() + }() + + if _, err := db.Exec(` + create table t(i int); + begin; + `); err != nil { + b.Fatal(err) + } + + s, err := db.Prepare("insert into t values(?)") + if err != nil { + b.Fatal(err) + } + + defer s.Close() + + for i := 0; i < n; i++ { + if _, err := s.Exec(int64(i)); err != nil { + b.Fatal(err) + } + } + if _, err := db.Exec("commit"); err != nil { + b.Fatal(err) + } + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + b.StopTimer() + if err, _ := db.Exec("delete * from t"); err != nil { + b.Fatal(err) + } + + b.StartTimer() + for i := 0; i < n; i++ { + if _, err := s.Exec(int64(i)); err != nil { + b.Fatal(err) + } + } + b.StopTimer() + } + b.StopTimer() + if *oRecsPerSec { + b.SetBytes(1e6 * int64(n)) + } +} + +// https://gitlab.com/cznic/sqlite/-/issues/39 +func BenchmarkInsertComparative(b *testing.B) { + dir := b.TempDir() + for _, memory := range inMemory { + filename := "file::memory:" + if !memory { + filename = filepath.Join(dir, "test.db") + } + for _, driver := range drivers { + for i, n := range []int{1e1, 1e2, 1e3, 1e4, 1e5 /*TODO 1e6 */} { + b.Run(makename(memory, driver, i+1), func(b *testing.B) { + benchmarkInsertComparative(b, driver, filename, n) if !memory { err := os.Remove(filename) if err != nil {