15 KiB
Benchmark
Benchmark are set to evolve. I have currently multiple ideas to improve performance.
ZipponDB is fairly fast and can easely query millions of entities. Current limitation is around 5GB I would say, depending of the use and kind of data saved. After that query can start to become slow as multiple optimization are still missing.
Most of query's time is writing entities into a JSON string. Parsing the file itself take little time. For example in the benchmark report bellow, I parse 100 000 users in around 40ms if there is no entities to send and 130ms if all 100 000 entities are to send.
I choosed to release ZipponDB binary with the small release. Zig has a fast and safe release, but the fast release isn't that much faster, if not at all.
Command
You can run zig build benchmark
, if you clone the repo to benchmark your machine. More info.
Here an example on my machine with 16 core:
=====================================
Populating with 5000 users.
Populate duration: 0.035698 seconds
Database path: benchmarkDB
Total size: 0.36Mb
CPU core: 16
Max file size: 5.00Mb
LOG: 0.02Mb
BACKUP: 0.00Mb
DATA: 0.33Mb
Item: 0.00Mb | 19 entities | 1 files
User: 0.33Mb | 5000 entities | 1 files
Order: 0.00Mb | 0 entities | 1 files
Category: 0.00Mb | 4 entities | 1 files
--------------------------------------
Query: GRAB User {}
Time: 16.90 ± 25.22 ms | Min 8.25ms | Max 92.55ms
Query: GRAB User {name='asd'}
Time: 2.62 ± 0.10 ms | Min 2.52ms | Max 2.85ms
Query: GRAB User [1] {}
Time: 0.16 ± 0.01 ms | Min 0.15ms | Max 0.18ms
Query: GRAB User [name] {}
Time: 7.88 ± 11.69 ms | Min 3.91ms | Max 42.94ms
Query: GRAB User {name = 'Charlie'}
Time: 3.87 ± 0.16 ms | Min 3.70ms | Max 4.17ms
Query: GRAB Category {}
Time: 0.20 ± 0.07 ms | Min 0.17ms | Max 0.41ms
Query: GRAB Item {}
Time: 0.21 ± 0.02 ms | Min 0.19ms | Max 0.25ms
Query: GRAB Order {}
Time: 0.14 ± 0.01 ms | Min 0.13ms | Max 0.18ms
Query: GRAB Order [from, items, quantity, at] {}
Time: 4.18 ± 12.01 ms | Min 0.15ms | Max 40.21ms
Query: DELETE User {}
Time: 0.64 ± 1.13 ms | Min 0.23ms | Max 4.04ms
Read: 1907698 Entity/second *Include small condition
Write: 350200 Entity/second
=====================================
Populating with 100000 users.
Populate duration: 0.707605 seconds
Database path: benchmarkDB
Total size: 6.62Mb
CPU core: 16
Max file size: 5.00Mb
LOG: 0.02Mb
BACKUP: 0.00Mb
DATA: 6.59Mb
Item: 0.00Mb | 19 entities | 1 files
User: 6.59Mb | 100000 entities | 2 files
Order: 0.00Mb | 0 entities | 1 files
Category: 0.00Mb | 4 entities | 1 files
--------------------------------------
Query: GRAB User {}
Time: 126.99 ± 3.05 ms | Min 123.37ms | Max 133.56ms
Query: GRAB User {name='asd'}
Time: 38.12 ± 1.60 ms | Min 36.48ms | Max 41.88ms
Query: GRAB User [1] {}
Time: 0.19 ± 0.02 ms | Min 0.16ms | Max 0.22ms
Query: GRAB User [name] {}
Time: 59.33 ± 1.29 ms | Min 58.02ms | Max 61.47ms
Query: GRAB User {name = 'Charlie'}
Time: 53.29 ± 1.00 ms | Min 51.50ms | Max 54.78ms
Query: GRAB Category {}
Time: 0.19 ± 0.01 ms | Min 0.18ms | Max 0.22ms
Query: GRAB Item {}
Time: 5.51 ± 13.43 ms | Min 0.22ms | Max 45.22ms
Query: GRAB Order {}
Time: 0.16 ± 0.01 ms | Min 0.15ms | Max 0.18ms
Query: GRAB Order [from, items, quantity, at] {}
Time: 0.17 ± 0.02 ms | Min 0.15ms | Max 0.21ms
Query: DELETE User {}
Time: 5.96 ± 17.04 ms | Min 0.26ms | Max 57.07ms
Read: 2623338 Entity/second *Include small condition
Write: 1125278 Entity/second
=====================================
Populating with 1000000 users.
Populate duration: 7.029142 seconds
Database path: benchmarkDB
Total size: 65.96Mb
CPU core: 16
Max file size: 5.00Mb
LOG: 0.02Mb
BACKUP: 0.00Mb
DATA: 65.93Mb
Item: 0.00Mb | 19 entities | 1 files
User: 65.93Mb | 1000000 entities | 14 files
Order: 0.00Mb | 0 entities | 1 files
Category: 0.00Mb | 4 entities | 1 files
--------------------------------------
Query: GRAB User {}
Time: 250.77 ± 6.74 ms | Min 247.08ms | Max 270.61ms
Query: GRAB User {name='asd'}
Time: 67.90 ± 0.42 ms | Min 67.31ms | Max 68.78ms
Query: GRAB User [1] {}
Time: 8.92 ± 24.86 ms | Min 0.55ms | Max 83.51ms
Query: GRAB User [name] {}
Time: 110.08 ± 5.27 ms | Min 106.86ms | Max 125.21ms
Query: GRAB User {name = 'Charlie'}
Time: 73.65 ± 2.79 ms | Min 69.24ms | Max 79.22ms
Query: GRAB Category {}
Time: 0.19 ± 0.04 ms | Min 0.16ms | Max 0.33ms
Query: GRAB Item {}
Time: 0.21 ± 0.02 ms | Min 0.19ms | Max 0.26ms
Query: GRAB Order {}
Time: 0.15 ± 0.01 ms | Min 0.14ms | Max 0.17ms
Query: GRAB Order [from, items, quantity, at] {}
Time: 0.17 ± 0.01 ms | Min 0.16ms | Max 0.18ms
Query: DELETE User {}
Time: 11.74 ± 34.19 ms | Min 0.29ms | Max 114.30ms
Read: 14727354 Entity/second *Include small condition
Write: 5468517 Entity/second
=====================================
Populating with 10000000 users.
Populate duration: 72.675680 seconds
Database path: benchmarkDB
Total size: 659.33Mb
CPU core: 16
Max file size: 5.00Mb
LOG: 0.02Mb
BACKUP: 0.00Mb
DATA: 659.30Mb
Item: 0.00Mb | 19 entities | 1 files
User: 659.30Mb | 10000000 entities | 132 files
Order: 0.00Mb | 0 entities | 1 files
Category: 0.00Mb | 4 entities | 1 files
--------------------------------------
Query: GRAB User {}
Time: 2535.29 ± 86.92 ms | Min 2448.39ms | Max 2712.78ms
Query: GRAB User {name='asd'}
Time: 684.75 ± 39.96 ms | Min 649.09ms | Max 797.13ms
Query: GRAB User [1] {}
Time: 6.65 ± 1.00 ms | Min 5.36ms | Max 8.75ms
Query: GRAB User [name] {}
Time: 1106.21 ± 33.57 ms | Min 1056.57ms | Max 1172.61ms
Query: GRAB User {name = 'Charlie'}
Time: 690.56 ± 20.41 ms | Min 661.51ms | Max 718.07ms
Query: GRAB Category {}
Time: 0.21 ± 0.03 ms | Min 0.18ms | Max 0.31ms
Query: GRAB Item {}
Time: 0.23 ± 0.04 ms | Min 0.19ms | Max 0.32ms
Query: GRAB Order {}
Time: 0.15 ± 0.01 ms | Min 0.13ms | Max 0.17ms
Query: GRAB Order [from, items, quantity, at] {}
Time: 0.17 ± 0.02 ms | Min 0.15ms | Max 0.21ms
Query: DELETE User {}
Time: 109.55 ± 326.64ms | Min 0.47ms | Max 1089.46ms
Read: 14603810 Entity/second *Include small condition
Write: 5403847 Entity/second
=====================================
Other core count
Here some benchmark with different number of cpu core.
Note that don't show 5000 users because it use a single file so there is no multi threading as it is done one thread per file.
1
=====================================
Populating with 100000 users.
Populate duration: 0.697690 seconds
Database path: benchmarkDB
Total size: 6.62Mb
CPU core: 1
Max file size: 5.00Mb
LOG: 0.02Mb
BACKUP: 0.00Mb
DATA: 6.59Mb
Item: 0.00Mb | 19 entities | 1 files
User: 6.59Mb | 100000 entities | 2 files
Order: 0.00Mb | 0 entities | 1 files
Category: 0.00Mb | 4 entities | 1 files
--------------------------------------
Query: GRAB User {}
Time: 169.31 ± 5.39 ms | Min 163.25ms | Max 181.23ms
Query: GRAB User {name='asd'}
Time: 49.66 ± 1.14 ms | Min 48.23ms | Max 51.71ms
Query: GRAB User [1] {}
Time: 0.20 ± 0.02 ms | Min 0.18ms | Max 0.25ms
Query: GRAB User [name] {}
Time: 75.81 ± 1.01 ms | Min 74.15ms | Max 77.42ms
Query: GRAB User {name = 'Charlie'}
Time: 73.54 ± 1.00 ms | Min 72.04ms | Max 75.61ms
Query: GRAB Category {}
Time: 0.16 ± 0.01 ms | Min 0.15ms | Max 0.19ms
Query: GRAB Item {}
Time: 6.37 ± 18.54 ms | Min 0.18ms | Max 62.01ms
Query: GRAB Order {}
Time: 0.15 ± 0.01 ms | Min 0.13ms | Max 0.18ms
Query: GRAB Order [from, items, quantity, at] {}
Time: 0.16 ± 0.02 ms | Min 0.14ms | Max 0.19ms
Query: DELETE User {}
Time: 8.07 ± 23.43 ms | Min 0.22ms | Max 78.35ms
Read: 2013655 Entity/second *Include small condition
Write: 835770 Entity/second
=====================================
Populating with 1000000 users.
Populate duration: 7.031715 seconds
Database path: benchmarkDB
Total size: 65.96Mb
CPU core: 1
Max file size: 5.00Mb
LOG: 0.02Mb
BACKUP: 0.00Mb
DATA: 65.93Mb
Item: 0.00Mb | 19 entities | 1 files
User: 65.93Mb | 1000000 entities | 14 files
Order: 0.00Mb | 0 entities | 1 files
Category: 0.00Mb | 4 entities | 1 files
--------------------------------------
Query: GRAB User {}
Time: 1720.31 ± 31.89 ms | Min 1674.61ms | Max 1787.15ms
Query: GRAB User {name='asd'}
Time: 511.09 ± 5.51 ms | Min 501.73ms | Max 521.17ms
Query: GRAB User [1] {}
Time: 4.34 ± 10.89 ms | Min 0.66ms | Max 37.02ms
Query: GRAB User [name] {}
Time: 788.89 ± 6.62 ms | Min 779.85ms | Max 802.79ms
Query: GRAB User {name = 'Charlie'}
Time: 763.96 ± 5.05 ms | Min 752.04ms | Max 771.09ms
Query: GRAB Category {}
Time: 0.19 ± 0.04 ms | Min 0.15ms | Max 0.28ms
Query: GRAB Item {}
Time: 0.21 ± 0.02 ms | Min 0.19ms | Max 0.24ms
Query: GRAB Order {}
Time: 0.13 ± 0.01 ms | Min 0.12ms | Max 0.14ms
Query: GRAB Order [from, items, quantity, at] {}
Time: 0.16 ± 0.01 ms | Min 0.15ms | Max 0.19ms
Query: DELETE User {}
Time: 78.98 ± 236.07ms | Min 0.24ms | Max 787.18ms
Read: 1956584 Entity/second *Include small condition
Write: 826982 Entity/second
=====================================
Populating with 10000000 users.
Populate duration: 74.074046 seconds
Database path: benchmarkDB
Total size: 659.33Mb
CPU core: 1
Max file size: 5.00Mb
LOG: 0.02Mb
BACKUP: 0.00Mb
DATA: 659.30Mb
Item: 0.00Mb | 19 entities | 1 files
User: 659.30Mb | 10000000 entities | 132 files
Order: 0.00Mb | 0 entities | 1 files
Category: 0.00Mb | 4 entities | 1 files
--------------------------------------
Query: GRAB User {}
Time: 18117.45 ± 106.80ms | Min 17946.04ms | Max 18349.54ms
Query: GRAB User {name='asd'}
Time: 5141.26 ± 67.78 ms | Min 5059.89ms | Max 5275.02ms
Query: GRAB User [1] {}
Time: 5.71 ± 0.22 ms | Min 5.34ms | Max 6.27ms
Query: GRAB User [name] {}
Time: 7863.72 ± 26.90 ms | Min 7823.04ms | Max 7911.72ms
Query: GRAB User {name = 'Charlie'}
Time: 7724.32 ± 38.54 ms | Min 7671.13ms | Max 7812.13ms
Query: GRAB Category {}
Time: 0.21 ± 0.07 ms | Min 0.15ms | Max 0.38ms
Query: GRAB Item {}
Time: 0.22 ± 0.07 ms | Min 0.18ms | Max 0.42ms
Query: GRAB Order {}
Time: 0.14 ± 0.01 ms | Min 0.13ms | Max 0.17ms
Query: GRAB Order [from, items, quantity, at] {}
Time: 0.17 ± 0.03 ms | Min 0.14ms | Max 0.25ms
Query: DELETE User {}
Time: 796.37 ± 2387.51ms | Min 0.41ms | Max 7958.91ms
Read: 1945047 Entity/second *Include small condition
Write: 770643 Entity/second
=====================================
4
=====================================
Populating with 100000 users.
Populate duration: 0.700273 seconds
Database path: benchmarkDB
Total size: 6.62Mb
CPU core: 4
Max file size: 5.00Mb
LOG: 0.02Mb
BACKUP: 0.00Mb
DATA: 6.59Mb
Item: 0.00Mb | 19 entities | 1 files
User: 6.59Mb | 100000 entities | 2 files
Order: 0.00Mb | 0 entities | 1 files
Category: 0.00Mb | 4 entities | 1 files
--------------------------------------
Query: GRAB User {}
Time: 131.92 ± 1.79 ms | Min 129.06ms | Max 135.24ms
Query: GRAB User {name='asd'}
Time: 38.23 ± 1.12 ms | Min 36.52ms | Max 40.35ms
Query: GRAB User [1] {}
Time: 0.17 ± 0.02 ms | Min 0.15ms | Max 0.22ms
Query: GRAB User [name] {}
Time: 60.60 ± 1.52 ms | Min 58.62ms | Max 64.49ms
Query: GRAB User {name = 'Charlie'}
Time: 53.90 ± 1.46 ms | Min 52.44ms | Max 56.96ms
Query: GRAB Category {}
Time: 0.17 ± 0.02 ms | Min 0.15ms | Max 0.21ms
Query: GRAB Item {}
Time: 3.70 ± 10.47 ms | Min 0.19ms | Max 35.10ms
Query: GRAB Order {}
Time: 0.13 ± 0.00 ms | Min 0.13ms | Max 0.14ms
Query: GRAB Order [from, items, quantity, at] {}
Time: 0.18 ± 0.07 ms | Min 0.15ms | Max 0.39ms
Query: DELETE User {}
Time: 6.00 ± 17.36 ms | Min 0.21ms | Max 58.08ms
Read: 2615841 Entity/second *Include small condition
Write: 1067359 Entity/second
=====================================
Populating with 1000000 users.
Populate duration: 6.912029 seconds
Database path: benchmarkDB
Total size: 65.96Mb
CPU core: 4
Max file size: 5.00Mb
LOG: 0.02Mb
BACKUP: 0.00Mb
DATA: 65.93Mb
Item: 0.00Mb | 19 entities | 1 files
User: 65.93Mb | 1000000 entities | 14 files
Order: 0.00Mb | 0 entities | 1 files
Category: 0.00Mb | 4 entities | 1 files
--------------------------------------
Query: GRAB User {}
Time: 580.46 ± 7.08 ms | Min 566.39ms | Max 591.97ms
Query: GRAB User {name='asd'}
Time: 166.33 ± 3.12 ms | Min 161.76ms | Max 171.96ms
Query: GRAB User [1] {}
Time: 2.88 ± 6.81 ms | Min 0.53ms | Max 23.32ms
Query: GRAB User [name] {}
Time: 262.20 ± 5.78 ms | Min 255.59ms | Max 273.91ms
Query: GRAB User {name = 'Charlie'}
Time: 190.25 ± 5.76 ms | Min 184.78ms | Max 204.83ms
Query: GRAB Category {}
Time: 0.18 ± 0.04 ms | Min 0.16ms | Max 0.29ms
Query: GRAB Item {}
Time: 0.22 ± 0.02 ms | Min 0.19ms | Max 0.28ms
Query: GRAB Order {}
Time: 0.14 ± 0.01 ms | Min 0.13ms | Max 0.17ms
Query: GRAB Order [from, items, quantity, at] {}
Time: 0.16 ± 0.01 ms | Min 0.15ms | Max 0.19ms
Query: DELETE User {}
Time: 26.91 ± 79.86 ms | Min 0.26ms | Max 266.51ms
Read: 6012012 Entity/second *Include small condition
Write: 2414729 Entity/second
=====================================
Populating with 10000000 users.
Populate duration: 69.969231 seconds
Database path: benchmarkDB
Total size: 659.33Mb
CPU core: 4
Max file size: 5.00Mb
LOG: 0.02Mb
BACKUP: 0.00Mb
DATA: 659.30Mb
Item: 0.00Mb | 19 entities | 1 files
User: 659.30Mb | 10000000 entities | 132 files
Order: 0.00Mb | 0 entities | 1 files
Category: 0.00Mb | 4 entities | 1 files
--------------------------------------
Query: GRAB User {}
Time: 5306.69 ± 34.07 ms | Min 5226.70ms | Max 5344.36ms
Query: GRAB User {name='asd'}
Time: 1475.91 ± 24.85 ms | Min 1430.52ms | Max 1509.27ms
Query: GRAB User [1] {}
Time: 4.73 ± 0.30 ms | Min 4.42ms | Max 5.32ms
Query: GRAB User [name] {}
Time: 2374.83 ± 21.66 ms | Min 2343.64ms | Max 2410.61ms
Query: GRAB User {name = 'Charlie'}
Time: 1556.61 ± 31.91 ms | Min 1512.58ms | Max 1622.71ms
Query: GRAB Category {}
Time: 0.21 ± 0.06 ms | Min 0.16ms | Max 0.37ms
Query: GRAB Item {}
Time: 0.20 ± 0.01 ms | Min 0.19ms | Max 0.24ms
Query: GRAB Order {}
Time: 0.14 ± 0.01 ms | Min 0.13ms | Max 0.17ms
Query: GRAB Order [from, items, quantity, at] {}
Time: 0.19 ± 0.05 ms | Min 0.14ms | Max 0.34ms
Query: DELETE User {}
Time: 246.23 ± 737.02ms | Min 0.43ms | Max 2457.29ms
Read: 6775468 Entity/second *Include small condition
Write: 2610439 Entity/second
=====================================