Skip to content

Commit e60a1f2

Browse files
committed
chore: add basic benchmark results
1 parent efbc3ff commit e60a1f2

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

README.md

+54
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,60 @@ const message = capnp.Message.fromArrayBuffer(buffer);
6262
const struct = message.getRoot(MyStruct);
6363
```
6464

65+
## Benchmarks
66+
67+
In theory, since capnp does not needs any serialization and deserialization, it is INFINITY TIMES faster than any other protocol as "parse" only happens on field access.
68+
69+
To be more fair, we [benchmark](./test//benchmark) by accessing fields in different ways. It is still up to **%65** faster even on a small JSON payload than `JSON.parse`.
70+
71+
<details>
72+
73+
<summary>results</summary>
74+
75+
```
76+
$ node --import jiti/register ./test/benchmark/bench.ts
77+
78+
cpu: Apple M2
79+
runtime: node v20.15.1 (arm64-darwin)
80+
81+
benchmark time (avg) (min … max) p75 p99 p999
82+
------------------------------------------------------------------------------ -----------------------------
83+
• iteration over deeply nested lists
84+
------------------------------------------------------------------------------ -----------------------------
85+
capnp.Message(<buff>) 1'357 ns/iter (1'119 ns … 2'546 ns) 1'451 ns 1'685 ns 2'546 ns
86+
JSON.parse(<string>) 1'990 ns/iter (1'911 ns … 2'368 ns) 2'003 ns 2'150 ns 2'368 ns
87+
JSON.parse(TextDecoder.decode(<buff>)) 2'166 ns/iter (2'130 ns … 2'548 ns) 2'171 ns 2'544 ns 2'548 ns
88+
89+
summary for iteration over deeply nested lists
90+
capnp.Message(<buff>)
91+
1.47x faster than JSON.parse(<string>)
92+
1.6x faster than JSON.parse(TextDecoder.decode(<buff>))
93+
94+
• top level list length access
95+
------------------------------------------------------------------------------ -----------------------------
96+
capnp.Message(<buff>) 1'662 ns/iter (1'340 ns … 2'293 ns) 1'794 ns 2'263 ns 2'293 ns
97+
JSON.parse(<string>) 2'156 ns/iter (2'100 ns … 2'620 ns) 2'157 ns 2'378 ns 2'620 ns
98+
JSON.parse(TextDecoder.decode(<buff>)) 2'291 ns/iter (2'240 ns … 2'492 ns) 2'311 ns 2'454 ns 2'492 ns
99+
100+
summary for top level list length access
101+
capnp.Message(<buff>)
102+
1.3x faster than JSON.parse(<string>)
103+
1.38x faster than JSON.parse(TextDecoder.decode(<buff>))
104+
105+
• parse
106+
------------------------------------------------------------------------------ -----------------------------
107+
capnp.Message(<buff>).getRoot() 1'328 ns/iter (1'110 ns … 1'710 ns) 1'456 ns 1'688 ns 1'710 ns
108+
JSON.parse(<string>) 2'043 ns/iter (1'982 ns … 2'222 ns) 2'107 ns 2'213 ns 2'222 ns
109+
JSON.parse(TextDecoder.decode(<buff>)) 2'190 ns/iter (2'111 ns … 2'349 ns) 2'264 ns 2'338 ns 2'349 ns
110+
111+
summary for parse
112+
capnp.Message(<buff>).getRoot()
113+
1.54x faster than JSON.parse(<string>)
114+
1.65x faster than JSON.parse(TextDecoder.decode(<buff>))
115+
```
116+
117+
</details>
118+
65119
## Development
66120

67121
<details>

0 commit comments

Comments
 (0)