Skip to content

Commit 3b0ff56

Browse files
committedFeb 21, 2025
publish preliminary benchmark results
1 parent b327786 commit 3b0ff56

File tree

4 files changed

+70
-9
lines changed

4 files changed

+70
-9
lines changed
 

‎README.md

+26-3
Original file line numberDiff line numberDiff line change
@@ -103,12 +103,35 @@ The `json-as` library has been optimized to achieve near-gigabyte-per-second JSO
103103

104104
### Raw Performance
105105

106+
Simple
107+
108+
| Test Case | Serialization (ops/s) | Deserialization (ops/s) | Serialization (MB/s) | Deserialization (MB/s) |
109+
|--------------------|-----------------------|-------------------------|----------------------|------------------------|
110+
| Vector3 Object | 32,642,320 ops/s | 9,736,272 ops/s | 1,240 MB/s | 369 MB/s |
111+
| Alphabet String | 4,928,856 ops/s | 7,567,360 ops/s | 975 MB/s | 1,498 MB/s |
112+
| Small JSON Object | [Fill Value] | [Fill Value] | [Fill Value] | [Fill Value] |
113+
| Medium JSON Object | [Fill Value] | [Fill Value] | [Fill Value] | [Fill Value] |
114+
| Large JSON Object | [Fill Value] | [Fill Value] | [Fill Value] | [Fill Value] |
115+
116+
SIMD
117+
106118
| Test Case | Serialization (ops/s) | Deserialization (ops/s) | Serialization (MB/s) | Deserialization (MB/s) |
107119
|--------------------|-----------------------|-------------------------|----------------------|------------------------|
108120
| Vector3 Object | 32,642,320 ops/s | 9,736,272 ops/s | 1,240 MB/s | 369 MB/s |
109-
| Small JSON Object | [Fill Value] | [Fill Value] | [Fill Value] |
110-
| Medium JSON Object | [Fill Value] | [Fill Value] | [Fill Value] |
111-
| Large JSON Object | [Fill Value] | [Fill Value] | [Fill Value] |
121+
| Alphabet String | 20,368,584 ops/s | 28,467,424 ops/s | 3,910 MB/s | 5,636 MB/s |
122+
| Small JSON Object | [Fill Value] | [Fill Value] | [Fill Value] | [Fill Value] |
123+
| Medium JSON Object | [Fill Value] | [Fill Value] | [Fill Value] | [Fill Value] |
124+
| Large JSON Object | [Fill Value] | [Fill Value] | [Fill Value] | [Fill Value] |
125+
126+
JavaScript
127+
128+
| Test Case | Serialization (ops/s) | Deserialization (ops/s) | Serialization (MB/s) | Deserialization (MB/s) |
129+
|--------------------|-----------------------|-------------------------|----------------------|------------------------|
130+
| Vector3 Object | 2,548,013 ops/s | 1,942,440 ops/s | 97 MB/s | 73 MB/s |
131+
| Alphabet String | 3,221,556 ops/s | 2,716,617 ops/s | 624 MB/s | 537 MB/s |
132+
| Small JSON Object | [Fill Value] | [Fill Value] | [Fill Value] | [Fill Value] |
133+
| Medium JSON Object | [Fill Value] | [Fill Value] | [Fill Value] | [Fill Value] |
134+
| Large JSON Object | [Fill Value] | [Fill Value] | [Fill Value] | [Fill Value] |
112135

113136
### Real-World Usage
114137

‎assembly/__benches__/misc.bench.ts

+32-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ import { bench } from "as-bench/assembly";
22
import { JSON } from "..";
33
import { Vec3 } from "./schemas";
44
import { bs } from "../../modules/as-bs/assembly";
5+
import { serializeString_SIMD } from "../serialize/simd/string";
6+
import { serializeString } from "../serialize/simple/string";
7+
import { deserializeString } from "../deserialize/simple/string";
8+
import { bytes } from "../util";
9+
import { deserializeString_SIMD } from "../deserialize/simd/string";
510

611
const vec: Vec3 = {
712
x: 1,
@@ -14,6 +19,30 @@ bs.ensureSize(4096);
1419
// JSON.stringify(vec);
1520
// });
1621

17-
bench("Deserialize Vector3", () => {
18-
JSON.parse<Vec3>('{"x":1,"y":2,"z":3}');
19-
});
22+
// bench("Deserialize Vector3", () => {
23+
// JSON.parse<Vec3>('{"x":1,"y":2,"z":3}');
24+
// });
25+
26+
// bench("Serialize String SIMD", () => {
27+
// serializeString_SIMD("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~`!@#$%^&*()-_=+{[}]|\\:;\"'?/>.<,'\"}");
28+
// bs.offset = changetype<usize>(bs.buffer);
29+
// bs.stackSize = 0;
30+
// });
31+
32+
// bench("Serialize String", () => {
33+
// serializeString("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~`!@#$%^&*()-_=+{[}]|\\:;\"'?/>.<,'\"}");
34+
// bs.offset = changetype<usize>(bs.buffer);
35+
// bs.stackSize = 0;
36+
// });
37+
38+
const src = '"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~`!@#$%^&*()-_=+{[}]|\\\\:;\\"\'?/>.<,\'\\"}"';
39+
const srcStart = changetype<usize>(src);
40+
const srcEnd = srcStart + bytes(src);
41+
const out = changetype<usize>(new ArrayBuffer(256));
42+
bench("Deserialize String", () => {
43+
deserializeString(srcStart, srcEnd, out);
44+
});
45+
46+
bench("Deserialize String SIMD", () => {
47+
deserializeString_SIMD(srcStart, srcEnd, out);
48+
})

‎assembly/deserialize/simd/string.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const SPLAT_92 = i16x8.splat(92); /* \ */
1010
* @returns number of bytes written
1111
*/
1212
// todo: optimize and stuff. it works, its not pretty. ideally, i'd like this to be (nearly) branchless
13-
export function deserializeString_SIMD(src: string, srcStart: usize, srcEnd: usize, dst: usize): usize {
13+
export function deserializeString_SIMD(srcStart: usize, srcEnd: usize, dst: usize): usize {
1414
let src_ptr = srcStart + 2;
1515
let dst_ptr = changetype<usize>(dst);
1616

‎bench.js

+11-2
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,17 @@ const vec = {
3434
let data;
3535

3636
const bench = new Bench({ time: 1000 })
37-
.add("stringify float", () => {
38-
data = JSON.stringify('h\\ello wor"ld');
37+
.add("serialize vec3", () =>
38+
data = JSON.stringify(vec)
39+
)
40+
.add("deserialize vec3", () => {
41+
data = JSON.parse('{"x":3,"y":1,"z":8}');
42+
})
43+
.add("serialize alphabet string", () => {
44+
data = JSON.stringify("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~`!@#$%^&*()-_=+{[}]|\\:;\"'?/>.<,'\"}");
45+
})
46+
.add("deserialize alphabet string", () => {
47+
data = JSON.parse('"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~`!@#$%^&*()-_=+{[}]|\\\\:;\\"\'?/>.<,\'\\"}"')
3948
}) /*
4049
.add("parse float", () => {
4150
data = JSON.parse("1.2345")

0 commit comments

Comments
 (0)