Created
December 8, 2022 20:35
-
-
Save markuswustenberg/7247c6fbe7964a0e61d44e57a580a7f0 to your computer and use it in GitHub Desktop.
Go and SQLite benchmarks parallel, v2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package sqlite_test | |
import ( | |
"database/sql" | |
"fmt" | |
"path" | |
"testing" | |
_ "github.com/mattn/go-sqlite3" | |
"sqlite" | |
) | |
func BenchmarkWriteBlogPost(b *testing.B) { | |
for _, parallelism := range []int{4, 8, 16, 32, 64, 128, 256, 512, 1024} { | |
b.Run(fmt.Sprintf("parallelism %v", parallelism), func(b *testing.B) { | |
b.Run("write blog post without WAL", func(b *testing.B) { | |
b.SkipNow() | |
db := setupDB(b, "?_timeout=10000&_fk=true") | |
b.SetParallelism(parallelism) | |
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.SetParallelism(parallelism) | |
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.SetParallelism(parallelism) | |
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 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment