Awesome
golang-db-sql-benchmark
A collection of benchmarks for popular Go database/SQL utilities
Libraries under test
database/sql SQL Execution Benchmarks:
- BenchmarkPreparedStatementsNone - Runs simple queries without query arguments, so database/sql doesn't need to create a prepared statement
- BenchmarkPreparedStatementsThrowaway - Runs queries with query arguments. database/sql must create and then throwaway a prepared statement each time
- BenchmarkPreparedStatementsSingle - Runs queries with query arguments, but creates and reuses the a single prepared statement
Dbr/Sqlx/Gorp SQL Execution Benchmarks:
Each library under test has the same set of benchmarks, just replace Dbr
in the examples with Sqlx
or Gorp
.
Each one is run with varying number of rows, N.
- BenchmarkDbrSelectIntsN - Select rows of integers into []int64's
- BenchmarkDbrSelectAllN - Select rows into structs using no query arguments
- BenchmarkDbrSelectAllWithArgsN - Select rows into structs using query arguments
Dbr/Squrrel SQL Building Benchamrks
Test building (but not executing) various SQL statements
- BenchmarkBuilderDbrSimple - Simple SQL query with dbr
- BenchmarkBuilderDbrComplex - Complex SQL query with dbr
- BenchmarkBuilderSquirrelSimple - Simple SQL query with squirrel
- BenchmarkBuilderSquirrelComplex - Complex SQL query with squirrel
Output
godep go test -bench=. -benchmem 2>/dev/null | column -t
on @tyler-smith's 2.6 GHz i7 Macbook Pro:
BenchmarkPreparedStatementsNone 100000 23137 ns/op 612 B/op 20 allocs/op
BenchmarkPreparedStatementsThrowaway 20000 94086 ns/op 795 B/op 25 allocs/op
BenchmarkPreparedStatementsSingle 50000 33426 ns/op 652 B/op 23 allocs/op
BenchmarkDbrSelectInts1 100000 30098 ns/op 1198 B/op 22 allocs/op
BenchmarkDbrSelectInts100 20000 94477 ns/op 11645 B/op 426 allocs/op
BenchmarkDbrSelectInts1000 5000 627958 ns/op 100574 B/op 4041 allocs/op
BenchmarkDbrSelectInts10000 500 6207828 ns/op 1297929 B/op 40177 allocs/op
BenchmarkDbrSelectAll1 50000 35468 ns/op 1876 B/op 60 allocs/op
BenchmarkDbrSelectAll100 10000 157510 ns/op 29256 B/op 863 allocs/op
BenchmarkDbrSelectAll1000 2000 1436856 ns/op 272365 B/op 8078 allocs/op
BenchmarkDbrSelectAll10000 100 12927094 ns/op 2979829 B/op 80171 allocs/op
BenchmarkDbrSelectAllWithArgs1 50000 38959 ns/op 2590 B/op 72 allocs/op
BenchmarkDbrSelectAllWithArgs100 10000 162227 ns/op 29970 B/op 875 allocs/op
BenchmarkDbrSelectAllWithArgs1000 2000 1227154 ns/op 273765 B/op 8093 allocs/op
BenchmarkDbrSelectAllWithArgs10000 100 13342026 ns/op 3000164 B/op 80284 allocs/op
BenchmarkSqlxSelectInts1 20000 86128 ns/op 628 B/op 22 allocs/op
BenchmarkSqlxSelectInts100 10000 203886 ns/op 9480 B/op 426 allocs/op
BenchmarkSqlxSelectInts1000 2000 1289621 ns/op 83799 B/op 4038 allocs/op
BenchmarkSqlxSelectInts10000 100 15156243 ns/op 1134724 B/op 40139 allocs/op
BenchmarkSqlxSelectAll1 50000 32373 ns/op 959 B/op 25 allocs/op
BenchmarkSqlxSelectAll100 10000 177965 ns/op 28366 B/op 828 allocs/op
BenchmarkSqlxSelectAll1000 1000 1634705 ns/op 271352 B/op 8042 allocs/op
BenchmarkSqlxSelectAll10000 100 17483420 ns/op 2989883 B/op 80191 allocs/op
BenchmarkSqlxSelectAllWithArgs1 10000 140460 ns/op 1228 B/op 30 allocs/op
BenchmarkSqlxSelectAllWithArgs100 10000 250621 ns/op 23682 B/op 634 allocs/op
BenchmarkSqlxSelectAllWithArgs1000 2000 1548073 ns/op 229879 B/op 6049 allocs/op
BenchmarkSqlxSelectAllWithArgs10000 100 15441239 ns/op 2587009 B/op 60190 allocs/op
BenchmarkGorpSelectInts1 10000 134277 ns/op 432 B/op 15 allocs/op
BenchmarkGorpSelectAll1 50000 44086 ns/op 1983 B/op 75 allocs/op
BenchmarkGorpSelectAll100 10000 232527 ns/op 34258 B/op 978 allocs/op
BenchmarkGorpSelectAll1000 1000 1563675 ns/op 321846 B/op 9100 allocs/op
BenchmarkGorpSelectAll10000 100 16451807 ns/op 3472508 B/op 90250 allocs/op
BenchmarkGorpSelectAllWithArgs1 10000 131738 ns/op 2306 B/op 80 allocs/op
BenchmarkGorpSelectAllWithArgs100 10000 265323 ns/op 29948 B/op 785 allocs/op
BenchmarkGorpSelectAllWithArgs1000 2000 1423747 ns/op 279838 B/op 7103 allocs/op
BenchmarkGorpSelectAllWithArgs10000 100 14538568 ns/op 3072519 B/op 70263 allocs/op
BenchmarkBuilderDbrSimple 1000000 1699 ns/op 866 B/op 13 allocs/op
BenchmarkBuilderDbrComplex 500000 6193 ns/op 2190 B/op 37 allocs/op
BenchmarkBuilderSquirrelSimple 200000 8981 ns/op 2780 B/op 51 allocs/op
BenchmarkBuilderSquirrelComplex 50000 44721 ns/op 11707 B/op 259 allocs/op
Run yourself
- Use the
godep
tool or manually install all libraries under test - Create db:
mysql -e "create database golang_sql_benchmarks;"
- Create schema:
mysql golang_sql_benchmarks < structure.sql
- Run:
godep go test -bench=. -benchmem
- You can set the MySQL DSN to use by setting the GOLANG_SQL_BENCHMARKS_DSN env var (defaults to root@unix(/var/run/mysqld/mysqld.sock)/golang_sql_benchmarks)