Grove

Benchmarks

Performance comparison: Grove vs raw SQL, Bun, and GORM

Grove is designed for near-raw performance. These benchmarks compare Grove against raw database/sql, Bun, and GORM using SQLite in-memory databases.

Running Benchmarks

# Run all benchmarks
make bench

# Generate markdown report
make bench-report

# Update README.md and docs with latest results
make bench-update

Results

Benchmarks generated on 2026-02-22 with go1.25.7 on darwin/arm64. Each benchmark ran 5 times; values are averages.

Insert

Libraryns/opB/opallocs/opvs Raw SQL
Raw SQL4,01588020baseline
Grove4,3811,28328+9.1%
Bun8,4595,47027+110.7%
GORM10,2654,95466+155.7%

SelectOne

Libraryns/opB/opallocs/opvs Raw SQL
Raw SQL4,7471,09639baseline
Grove5,5751,45834+17.4%
Bun6,6955,94443+41.0%
GORM8,0704,38381+70.0%

SelectMulti

Libraryns/opB/opallocs/opvs Raw SQL
Raw SQL58,07920,984388baseline
Grove45,68623,413584-21.3%
Bun67,18423,192395+15.7%
GORM83,21728,570765+43.3%

Update

Libraryns/opB/opallocs/opvs Raw SQL
Raw SQL2,82152013baseline
Grove3,6171,01021+28.2%
Bun4,0745,20519+44.4%
GORM5,4684,02049+93.8%

Delete

Libraryns/opB/opallocs/opvs Raw SQL
Raw SQL3,4792328baseline
Grove5,08355313+46.1%
Bun5,1474,88012+47.9%
GORM6,6602,85636+91.4%

BulkInsert100

Libraryns/opB/opallocs/opvs Raw SQL
Raw SQL151,00660,1411524baseline
Grove105,57242,1111421-30.1%
Bun143,53230,389224-4.9%
GORM187,91493,7061251+24.4%

BulkInsert1000

Libraryns/opB/opallocs/opvs Raw SQL
Raw SQL1,401,957605,38416513baseline
Grove967,190409,75314021-31.0%
Bun1,359,612408,6942033-3.0%
GORM1,782,186894,16612051+27.1%

BuildSelect

Variantns/opB/opallocs/op
Grove45386411
Bun8251,74417

BuildInsert

Variantns/opB/opallocs/op
Grove84293019
Bun1,0121,42517

BuildUpdate

Variantns/opB/opallocs/op
Grove38073611
Bun5971,18414

SchemaCache

Variantns/opB/opallocs/op
CacheHit1100
ColdStart3,1233,72875

TagResolution

Variantns/opB/opallocs/op
GroveTags3,1013,72875
BunFallback3,3983,73674

Methodology

  • Database: SQLite in-memory (:memory:) -- isolates ORM overhead from network/disk
  • Runs: 5 iterations per benchmark (-count=5) for statistical stability
  • Model: User struct with 6 fields (ID, Name, Email, Age, Active, CreatedAt)
  • Metrics: ns/op, B/op (bytes allocated), allocs/op (heap allocations)
  • Overhead: Computed as (ORM - RawSQL) / RawSQL * 100%

What's Measured

CategoryDescription
InsertSingle row INSERT
SelectOneSELECT single row by PK
SelectMultiSELECT 50 rows with WHERE + LIMIT
UpdateUPDATE 2 columns by PK
DeleteDELETE single row by PK
BulkInsert100INSERT 100 rows in one operation
BulkInsert1000INSERT 1000 rows in one operation
BuildSelectSQL generation only (no I/O)
BuildInsertSQL generation only (no I/O)
BuildUpdateSQL generation only (no I/O)
SchemaCacheSchema registry cache hit vs cold start
TagResolutionGrove tags vs bun tag fallback resolution

On this page