ZipponDB/docs/Benchmark.md
2025-01-30 21:21:02 +01:00

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
=====================================