Benchmarking QDAC3 JSON parser
Do you know QDAC3 ?
This is an open source project, from China (with Chinese comments and exception errors messages, but the methods and variables are in English).
It is cross-platform, and told to be very fast about JSON process.
So I included QDAC3 in
our "25 - JSON performance" sample.
Numbers are talking, now.
Here are some numbers, compiled with XE7 under Win32:
1. Small content
1.1. Synopse record:
- Read: 50,000 assertions passed 158.31ms 315,822/s
- Access: 100,000 assertions passed 795us 62,893,081/s
- Write: 50,000 assertions passed 111.58ms 448,088/s
Total failed: 0 / 200,000 - Synopse record PASSED 271.46ms
1.2. Synopse variant:
- Read: 50,000 assertions passed 364.70ms 137,096/s
- Access direct: 100,000 assertions passed 61.71ms 810,149/s
- Access late binding: 100,000 assertions passed 722.41ms 69,212/s
- Write: 50,000 assertions passed 218.17ms 229,174/s
Total failed: 0 / 300,000 - Synopse variant PASSED 1.36s
1.3. Synopse cross platform variant:
- Read: 50,000 assertions passed 642.89ms 77,773/s
- Access direct: 100,000 assertions passed 38.80ms 1,288,560/s
- Access late binding: 100,000 assertions passed 627.81ms 79,641/s
- Write: 50,000 assertions passed 607.77ms 82,267/s
Total failed: 0 / 300,000 - Synopse cross platform variant PASSED 1.91s
- Read: 50,000 assertions passed 637.91ms 78,379/s
- Access: 100,000 assertions passed 89.47ms 558,846/s
- Write: 50,000 assertions passed 391.53ms 127,703/s
Total failed: 0 / 200,000 - QDAC PASSED 1.12s
2. Big content
2.1. Depth content:
- Download files if necessary: no assertion 358us
- Synopse read variant: 1 assertion passed 161.44ms 309,712/s 227 KB
- Synopse read to BSON: 2 assertions passed 2.62ms 19,025,875/s 159 KB
- Synopse cross platform: 1 assertion passed 3.85ms 12,960,082/s 300 KB
Total failed: 0 / 4 - Depth content PASSED 174.67ms
2.2. Table content:
- Download files if necessary: no assertion 587us 14,017,035/s
- Synopse parse: 1 assertion passed 2.67ms 3,077,815/s 1.2 MB
- Synopse ORM loop: 41,135 assertions passed 6.25ms 1,316,320/s 1.2 MB
- Synopse ORM list: 41,135 assertions passed 6.77ms 1,214,138/s 1016 KB
- Synopse table direct: 41,135 assertions passed 19.66ms 418,463/s 1.2 MB
- Synopse table variant: 41,135 assertions passed 99.07ms 83,037/s 1.2 MB
- Synopse doc variant: 41,137 assertions passed 31.13ms 264,227/s 3.0 MB
- Synopse late binding: 41,137 assertions passed 107.81ms 76,305/s 3.0 MB
- Synopse cross ORM: 41,135 assertions passed 17.14ms 479,876/s 1.9 MB
- Synopse cross direct: 41,135 assertions passed 19.59ms 419,937/s 1.9 MB
- Synopse cross variant: 41,135 assertions passed 102.76ms 80,053/s 1.9 MB
- Synopse to BSON: 2 assertions passed 10.64ms 772,923/s 1.0 MB
- QDAC: 41,136 assertions passed 41.42ms 198,604/s 5.9 MB
Total failed: 0 / 411,358 - Table content PASSED 491.91ms
2.3. Huge content:
- Download files if necessary: no assertion 499us
- Synopse beautifier: 1 assertion passed 1.36s 36,554/s 395.5 MB
- Synopse read record: 4 assertions passed 1.42s 144,924/s 113.5 MB
- Synopse read variant: 2 assertions passed 3.25s 63,404/s 377.4 MB
- Synopse cross platform: 2 assertions passed 5.35s 38,558/s 424.9 MB
- Synopse read to BSON: 3 assertions passed 1.95s 105,727/s 168.1 MB
- QDAC read: 2 assertions passed 8.28s 24,920/s 1.1 GB
Total failed: 0 / 14 - Huge content PASSED 22.73s
Generated with: Delphi XE7 compiler
Time elapsed for all tests: 28.08s
Tests performed at 01/02/2015 13:46:04
Total assertions failed for all test suits: 0 / 1,411,376
All tests passed successfully.
For small objects, it performs very well - but of course slower than mORMot
But for bigger content, it consumes a lot of memory.
For instance, when reading a table of data results as JSON array of objects:
- Our ORM code performs at 1,316,320 rows/s and uses 1.2 MB of RAM;
- QDAC achieves 198,604 row/s and uses 5.9 MB.
That is 8 times slower, and using 5 times more memory.
Performance is similar under Win64:
- Our ORM code performs at 1,190,076 rows/s and uses 1.3 MB of RAM;
- QDAC achieves 178,607 row/s and uses 9.3 MB.
That is 8 times slower, and using 7 times more memory.
We did not test QDAC cross-platform abilities, nor its RTTI methods, which should be even slower.
But we found a very annoying implementation issue of the JSON
We discovered that QDAC it is not able to parse "" as a key, whereas it is valid JSON key.
All other parsers do accept this sample.json reference content.
I hope they will fix this issue.
Comments and feedback is welcome on our forum, as usual.