Skip to content

Instantly share code, notes, and snippets.

@markuswustenberg
Created December 8, 2022 20:44
Show Gist options
  • Save markuswustenberg/19cbbf8c26aaf778f9ce8aef760ca8af to your computer and use it in GitHub Desktop.
Save markuswustenberg/19cbbf8c26aaf778f9ce8aef760ca8af to your computer and use it in GitHub Desktop.
Go and SQLite parallel benchmark, v3
module sqlite
go 1.19
require github.com/mattn/go-sqlite3 v1.14.16
github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y=
github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
.PHONY: benchmark
benchmark:
go test -cpu 4,8,16,32,64,128,256,512,1024 -bench=.
package sqlite
import (
"database/sql"
"sync"
)
func Setup(db *sql.DB) error {
_, err := db.Exec(`
create table posts (
id integer primary key,
title text not null,
content text not null,
created text not null default (strftime('%Y-%m-%dT%H:%M:%fZ'))
)`)
return err
}
func WriteBlogPost(db *sql.DB, title, content string) error {
_, err := db.Exec(`insert into posts (title, content) values (?, ?)`, title, content)
return err
}
var m sync.Mutex
func WriteBlogPostMutexed(db *sql.DB, title, content string) error {
m.Lock()
defer m.Unlock()
_, err := db.Exec(`insert into posts (title, content) values (?, ?)`, title, content)
return err
}
package sqlite_test
import (
"database/sql"
"path"
"testing"
_ "github.com/mattn/go-sqlite3"
"sqlite"
)
func BenchmarkWriteBlogPost(b *testing.B) {
b.Run("write blog post without WAL", func(b *testing.B) {
b.SkipNow()
db := setupDB(b, "?_timeout=10000&_fk=true")
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
if err := sqlite.WriteBlogPost(db, "Some title", "Some content"); err != nil {
b.Fatal(err)
}
}
})
})
b.Run("write blog post with WAL", func(b *testing.B) {
db := setupDB(b, "?_journal=WAL&_timeout=5000&_fk=true")
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
if err := sqlite.WriteBlogPost(db, "Some title", "Some content"); err != nil {
b.Fatal(err)
}
}
})
})
b.Run("write blog post with WAL and Go mutex", func(b *testing.B) {
db := setupDB(b, "?_journal=WAL&_timeout=5000&_fk=true")
b.RunParallel(func(pb *testing.PB) {
for pb.Next() {
if err := sqlite.WriteBlogPostMutexed(db, "Some title", "Some content"); err != nil {
b.Fatal(err)
}
}
})
})
}
func setupDB(b *testing.B, options string) *sql.DB {
dbPath := path.Join(b.TempDir(), "benchmark.db")
db, err := sql.Open("sqlite3", dbPath+options)
if err != nil {
b.Fatal(err)
}
if err := sqlite.Setup(db); err != nil {
b.Fatal(err)
}
return db
}
@markuswustenberg
Copy link
Author

$ make benchmark
go test -cpu 4,8,16,32,64,128,256,512,1024 -bench=.
goos: darwin
goarch: arm64
pkg: sqlite
BenchmarkWriteBlogPost/write_blog_post_with_WAL-4               	   93922	     12884 ns/op
BenchmarkWriteBlogPost/write_blog_post_with_WAL-8               	   84565	     12872 ns/op
BenchmarkWriteBlogPost/write_blog_post_with_WAL-16              	   76986	     17040 ns/op
BenchmarkWriteBlogPost/write_blog_post_with_WAL-32              	   81733	     14492 ns/op
BenchmarkWriteBlogPost/write_blog_post_with_WAL-64              	   54464	     18857 ns/op
BenchmarkWriteBlogPost/write_blog_post_with_WAL-128             	   26798	     40334 ns/op
BenchmarkWriteBlogPost/write_blog_post_with_WAL-256             	     576	   2055046 ns/op
BenchmarkWriteBlogPost/write_blog_post_with_WAL-512             	     727	   1655673 ns/op
BenchmarkWriteBlogPost/write_blog_post_with_WAL-1024            	     790	   1389052 ns/op
BenchmarkWriteBlogPost/write_blog_post_with_WAL_and_Go_mutex-4            	   80164	     14481 ns/op
BenchmarkWriteBlogPost/write_blog_post_with_WAL_and_Go_mutex-8            	   79414	     14766 ns/op
BenchmarkWriteBlogPost/write_blog_post_with_WAL_and_Go_mutex-16           	   70076	     15314 ns/op
BenchmarkWriteBlogPost/write_blog_post_with_WAL_and_Go_mutex-32           	   77756	     14915 ns/op
BenchmarkWriteBlogPost/write_blog_post_with_WAL_and_Go_mutex-64           	   76677	     15349 ns/op
BenchmarkWriteBlogPost/write_blog_post_with_WAL_and_Go_mutex-128          	   75244	     15799 ns/op
BenchmarkWriteBlogPost/write_blog_post_with_WAL_and_Go_mutex-256          	   79358	     15465 ns/op
BenchmarkWriteBlogPost/write_blog_post_with_WAL_and_Go_mutex-512          	   84992	     13391 ns/op
BenchmarkWriteBlogPost/write_blog_post_with_WAL_and_Go_mutex-1024         	   87088	     13899 ns/op
PASS
ok  	sqlite	40.572s

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment