diff --git a/AUTHORS b/AUTHORS index 44c477b..cce2dd5 100644 --- a/AUTHORS +++ b/AUTHORS @@ -9,5 +9,6 @@ # Please keep the list sorted. Davsk Ltd Co +Jaap Aarts Jan Mercl <0xjnml@gmail.com> Steffen Butzer diff --git a/CONTRIBUTORS b/CONTRIBUTORS index c79b3cf..3165b32 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -8,6 +8,7 @@ Alexander Menzhinsky David Skinner +Jaap Aarts Jan Mercl <0xjnml@gmail.com> Steffen Butzer Yaacov Akiba Slama \ No newline at end of file diff --git a/cgo_test.go b/cgo_test.go new file mode 100644 index 0000000..a00bd6e --- /dev/null +++ b/cgo_test.go @@ -0,0 +1,125 @@ +// Copyright 2017 The Sqlite Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//+build cgo,cgobench + +package sqlite // import "modernc.org/sqlite" + +import ( + "database/sql" + "fmt" + "os" + "testing" + + _ "github.com/mattn/go-sqlite3" +) + +const gcoDriver = "sqlite3" + +func prepareDatabase() string { + //if this fails you should probably clean your folders + for i := 0; ; i++ { + path := fmt.Sprintf("%dbench.db", i) + _, err := os.Stat(path) + if os.IsNotExist(err) { + return path + } + } +} + +var drivers = []string{ + driverName, + gcoDriver, +} + +var inMemory = []bool{ + true, + false, +} + +func makename(inMemory bool, driver string) string { + name := driver + if inMemory { + name += "InMemory" + } else { + name += "OnDisk" + } + return name +} + +func reading1Memory(b *testing.B, drivername, file string) { + 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 < b.N; i++ { + if _, err := s.Exec(int64(i)); err != nil { + b.Fatal(err) + } + } + if _, err := db.Exec("commit"); err != nil { + b.Fatal(err) + } + + r, err := db.Query("select * from t") + if err != nil { + b.Fatal(err) + } + + defer r.Close() + dst := 0 + b.ResetTimer() + for i := 0; i < b.N; i++ { + if !r.Next() { + b.Fatal(r.Err()) + } + err = r.Scan(&dst) + if err != nil { + b.Fatal(err) + } + } + b.StopTimer() + if *oRecsPerSec { + b.SetBytes(1e6) + } +} + +func BenchmarkReading1(b *testing.B) { + for _, memory := range inMemory { + filename := "file::memory:" + if !memory { + filename = prepareDatabase() + } + for _, driver := range drivers { + b.Run(makename(memory, driver), func(b *testing.B) { + reading1Memory(b, driver, filename) + if !memory { + err := os.Remove(filename) + if err != nil { + b.Fatal(err) + } + } + }) + } + } +} diff --git a/go.mod b/go.mod index 1625039..03d9c31 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module modernc.org/sqlite go 1.15 require ( + github.com/mattn/go-sqlite3 v1.14.6 modernc.org/libc v0.0.0-20210104224006-8ec70908d25a modernc.org/mathutil v1.2.1 modernc.org/tcl v0.0.0-20210104224342-fd497555fca0 diff --git a/go.sum b/go.sum index 2f315c3..2c32940 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg= +github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=