Storage-engine benchmark matrix

6 threads, random keys, compression=none, mean of 2 runs — Linux 6.19, xfs on NVMe, Intel i5-8500B (6 cores)

ondaDB benchmark suite — dataset: Linux / xfs · Apple M2 Ultra dataset → · raw CSV

Summary across all configurations

geometric mean of (engine ÷ fastest) over every config × phase cell (35 cells); 1.00× = fastest everywhere

0.00×0.20×0.40×0.60×ondaDB (Rust)0.58×TidesDB (C)0.51×wavesdb (Go)0.42×RocksDB (C++)0.41×BadgerDB (Go)0.37×fjall (Rust)0.22×surrealkv (Rust)0.08×
ondaDB (Rust)TidesDB (C)fjall (Rust)BadgerDB (Go)wavesdb (Go)RocksDB (C++)surrealkv (Rust)
score (geomean)0.580.510.220.370.420.410.08
cell wins131323400

Logical throughput (MB/s, key+value bytes)

ops/sec × (key size + value size) — how much payload each engine moves per second; makes the value-size sweep comparable

Put (batched, multi-threaded)

ondaDB (Rust)TidesDB (C)fjall (Rust)BadgerDB (Go)wavesdb (Go)RocksDB (C++)surrealkv (Rust)
16 B / 100 B641583569152125112
64 B / 512 B205702135275371261216
16 B / 1 KiB219832171468430266248
16 B / 4 KiB283644563637523461314
16 B / 16 KiB339705533751421577344
1 KiB / 256 B229987166448517271301
2 KiB / 256 B222653163520353238196

Get (cold, multi-threaded)

ondaDB (Rust)TidesDB (C)fjall (Rust)BadgerDB (Go)wavesdb (Go)RocksDB (C++)surrealkv (Rust)
16 B / 100 B99113351092892012
64 B / 512 B1,4931,2519942385563310
16 B / 1 KiB2,7771,3968266871,43994016
16 B / 4 KiB4,0492,5019,0801,1542,5011,16462
16 B / 16 KiB7,1894,55831,8601,2062,9471,441229
1 KiB / 256 B2,2701,719264278294519
2 KiB / 256 B2,7091,774347967321,12730

Put (batched, multi-threaded)

ops/sec — higher is better; whiskers span min–max across runs; the group leader is value-labeled

0500k1M1.50M2M1.37M16 B / 100 B1M ops1.22M64 B / 512 B400k ops800k16 B / 1 KiB250k ops157k16 B / 4 KiB30k ops46k16 B / 16 KiB8k ops771k1 KiB / 256 B150k ops284k2 KiB / 256 B100k ops
ondaDB (Rust)TidesDB (C)fjall (Rust)BadgerDB (Go)wavesdb (Go)RocksDB (C++)surrealkv (Rust)
16 B / 100 B551,5361,365,727302,392591,0621,314,1481,075,742969,563
64 B / 512 B355,3901,219,228233,962476,980644,727453,450375,114
16 B / 1 KiB210,159799,667164,429449,891413,714256,156238,898
16 B / 4 KiB68,814156,628136,814154,923127,300112,18476,276
16 B / 16 KiB20,66142,97432,48445,81225,69435,18820,963
1 KiB / 256 B178,542771,080129,832350,150403,788211,893234,823
2 KiB / 256 B96,139283,53370,670225,619153,130103,13385,202

Get (cold, multi-threaded)

ops/sec — higher is better; whiskers span min–max across runs; the group leader is value-labeled

01M2M3M4M2.50M16 B / 100 B1M ops2.59M64 B / 512 B400k ops2.67M16 B / 1 KiB250k ops2.21M16 B / 4 KiB30k ops1.94M16 B / 16 KiB8k ops1.77M1 KiB / 256 B150k ops1.18M2 KiB / 256 B100k ops
ondaDB (Rust)TidesDB (C)fjall (Rust)BadgerDB (Go)wavesdb (Go)RocksDB (C++)surrealkv (Rust)
16 B / 100 B857,096978,143298,042938,3862,495,4881,733,91817,555
64 B / 512 B2,591,8972,172,577171,070734,2311,485,0441,098,84417,489
16 B / 1 KiB2,669,7961,342,162794,602660,6221,383,420903,80215,864
16 B / 4 KiB984,622608,2892,208,288280,556608,157282,95314,957
16 B / 16 KiB438,335277,9461,942,69073,527179,68487,84213,956
1 KiB / 256 B1,773,4441,342,7671,508501,300610,567738,10315,040
2 KiB / 256 B1,175,832769,86814,624345,599317,882489,22613,081

Delete (batched, multi-threaded)

ops/sec — higher is better; whiskers span min–max across runs; the group leader is value-labeled

02M4M6M8M2.59M16 B / 100 B1M ops3.56M64 B / 512 B400k ops5.24M16 B / 1 KiB250k ops6.45M16 B / 4 KiB30k ops4.48M16 B / 16 KiB8k ops442k1 KiB / 256 B150k ops267k2 KiB / 256 B100k ops
ondaDB (Rust)TidesDB (C)fjall (Rust)BadgerDB (Go)wavesdb (Go)RocksDB (C++)surrealkv (Rust)
16 B / 100 B922,602221,376309,308525,7722,592,0252,223,1661,945,919
64 B / 512 B3,555,830557,010411,994468,8393,135,2741,576,1021,527,200
16 B / 1 KiB5,243,646786,532396,065722,5434,213,6023,253,6342,023,140
16 B / 4 KiB6,446,9661,182,4731,137,855998,6985,129,2784,654,8202,066,142
16 B / 16 KiB3,963,2281,472,9611,279,5851,165,7874,480,3964,183,5091,927,910
1 KiB / 256 B214,774159,862188,104390,006442,486266,638259,254
2 KiB / 256 B125,42972,45094,298266,667222,903163,17094,924

Forward scan (concurrent full iterations)

ops/sec — higher is better; whiskers span min–max across runs; the group leader is value-labeled

05M10M4.58M16 B / 100 B1M ops4.97M64 B / 512 B400k ops2.41M16 B / 1 KiB250k ops993k16 B / 4 KiB30k ops247k16 B / 16 KiB8k ops5.52M1 KiB / 256 B150k ops2.91M2 KiB / 256 B100k ops
ondaDB (Rust)TidesDB (C)fjall (Rust)BadgerDB (Go)wavesdb (Go)RocksDB (C++)surrealkv (Rust)
16 B / 100 B4,576,9653,115,1711,637,2083,202,8403,831,3122,865,0861,263,281
64 B / 512 B2,428,1564,969,9681,865,6801,449,764588,7401,447,832283,170
16 B / 1 KiB2,408,270489,658841,4661,084,515524,5431,028,006154,725
16 B / 4 KiB993,240380,747351,812474,249145,196368,06340,811
16 B / 16 KiB239,432191,67692,128246,55657,795231,4909,364
1 KiB / 256 B1,312,1005,523,656732,738912,8881,285,274867,814106,604
2 KiB / 256 B721,0302,909,283580,874438,438665,548576,13762,952

Backward scan (concurrent full iterations)

ops/sec — higher is better; whiskers span min–max across runs; the group leader is value-labeled

02M4M6M4.73M16 B / 100 B1M ops3.11M64 B / 512 B400k ops1.70M16 B / 1 KiB250k ops1.21M16 B / 4 KiB30k ops450k16 B / 16 KiB8k ops2.13M1 KiB / 256 B150k ops1.27M2 KiB / 256 B100k ops
ondaDB (Rust)TidesDB (C)fjall (Rust)BadgerDB (Go)wavesdb (Go)RocksDB (C++)surrealkv (Rust)
16 B / 100 B3,999,5334,727,2261,043,0443,316,8443,706,9062,336,012820,710
64 B / 512 B2,363,3863,114,6871,632,2361,533,702657,3301,207,368245,634
16 B / 1 KiB1,695,480448,519804,8991,168,052507,802960,497149,754
16 B / 4 KiB1,206,374366,368481,332476,640156,334451,22638,156
16 B / 16 KiB450,042195,072353,532270,82050,617288,6539,526
1 KiB / 256 B1,093,2342,127,990578,1421,058,9301,318,009424,861109,160
2 KiB / 256 B628,4581,274,561546,982490,987503,972229,43857,099