Skip to content

Commit 0a8e6e1

Browse files
wemeetagainnflaig
andauthored
feat: use snappy-wasm (#6483)
**Motivation** Benchmarks show `snappy-wasm` is faster at compressing and uncompressing than `snappyjs`. **Description** - Use `snappy-wasm` for compressing / uncompressing gossip payloads - Add more `snappy` vs `snappyjs` vs `snappy-wasm` benchmarks **TODO** - [x] deploy this branch on our test fleet - deployed on feat3 ``` network / gossip / snappy compress ✔ 100 bytes - compress - snappyjs 335566.9 ops/s 2.980032 us/op - 685 runs 2.54 s ✔ 100 bytes - compress - snappy 388610.3 ops/s 2.573272 us/op - 870 runs 2.74 s ✔ 100 bytes - compress - snappy-wasm 583254.0 ops/s 1.714519 us/op - 476 runs 1.32 s ✔ 100 bytes - compress - snappy-wasm - prealloc 1586695 ops/s 630.2410 ns/op - 481 runs 0.804 s ✔ 200 bytes - compress - snappyjs 298272.8 ops/s 3.352636 us/op - 213 runs 1.22 s ✔ 200 bytes - compress - snappy 419528.0 ops/s 2.383631 us/op - 926 runs 2.71 s ✔ 200 bytes - compress - snappy-wasm 472468.5 ops/s 2.116543 us/op - 577 runs 1.72 s ✔ 200 bytes - compress - snappy-wasm - prealloc 1430445 ops/s 699.0830 ns/op - 868 runs 1.11 s ✔ 300 bytes - compress - snappyjs 265124.9 ops/s 3.771807 us/op - 137 runs 1.02 s ✔ 300 bytes - compress - snappy 361683.9 ops/s 2.764845 us/op - 1332 runs 4.18 s ✔ 300 bytes - compress - snappy-wasm 443688.4 ops/s 2.253834 us/op - 859 runs 2.44 s ✔ 300 bytes - compress - snappy-wasm - prealloc 1213825 ops/s 823.8420 ns/op - 370 runs 0.807 s ✔ 400 bytes - compress - snappyjs 262168.5 ops/s 3.814341 us/op - 358 runs 1.87 s ✔ 400 bytes - compress - snappy 382494.9 ops/s 2.614414 us/op - 1562 runs 4.58 s ✔ 400 bytes - compress - snappy-wasm 406373.2 ops/s 2.460792 us/op - 797 runs 2.46 s ✔ 400 bytes - compress - snappy-wasm - prealloc 1111715 ops/s 899.5110 ns/op - 450 runs 0.906 s ✔ 500 bytes - compress - snappyjs 229213.1 ops/s 4.362753 us/op - 359 runs 2.07 s ✔ 500 bytes - compress - snappy 373695.8 ops/s 2.675973 us/op - 2050 runs 5.99 s ✔ 500 bytes - compress - snappy-wasm 714917.4 ops/s 1.398763 us/op - 960 runs 1.84 s ✔ 500 bytes - compress - snappy-wasm - prealloc 1054619 ops/s 948.2100 ns/op - 427 runs 0.907 s ✔ 1000 bytes - compress - snappyjs 148702.3 ops/s 6.724847 us/op - 171 runs 1.65 s ✔ 1000 bytes - compress - snappy 423688.1 ops/s 2.360227 us/op - 525 runs 1.74 s ✔ 1000 bytes - compress - snappy-wasm 524350.6 ops/s 1.907121 us/op - 273 runs 1.03 s ✔ 1000 bytes - compress - snappy-wasm - prealloc 685191.5 ops/s 1.459446 us/op - 349 runs 1.01 s ✔ 10000 bytes - compress - snappyjs 21716.92 ops/s 46.04704 us/op - 16 runs 1.24 s ✔ 10000 bytes - compress - snappy 98051.32 ops/s 10.19874 us/op - 184 runs 2.39 s ✔ 10000 bytes - compress - snappy-wasm 114681.8 ops/s 8.719783 us/op - 49 runs 0.937 s ✔ 10000 bytes - compress - snappy-wasm - prealloc 111203.6 ops/s 8.992518 us/op - 49 runs 0.953 s ✔ 100000 bytes - compress - snappyjs 2947.313 ops/s 339.2921 us/op - 12 runs 4.74 s ✔ 100000 bytes - compress - snappy 14963.78 ops/s 66.82801 us/op - 70 runs 5.19 s ✔ 100000 bytes - compress - snappy-wasm 19868.33 ops/s 50.33136 us/op - 14 runs 1.21 s ✔ 100000 bytes - compress - snappy-wasm - prealloc 24579.34 ops/s 40.68457 us/op - 13 runs 1.06 s uncompress ✔ 100 bytes - uncompress - snappyjs 589201.6 ops/s 1.697212 us/op - 242 runs 0.911 s ✔ 100 bytes - uncompress - snappy 537424.1 ops/s 1.860728 us/op - 220 runs 0.910 s ✔ 100 bytes - uncompress - snappy-wasm 634966.2 ops/s 1.574887 us/op - 194 runs 0.808 s ✔ 100 bytes - uncompress - snappy-wasm - prealloc 1846964 ops/s 541.4290 ns/op - 559 runs 0.804 s ✔ 200 bytes - uncompress - snappyjs 395141.8 ops/s 2.530737 us/op - 281 runs 1.22 s ✔ 200 bytes - uncompress - snappy 536862.6 ops/s 1.862674 us/op - 274 runs 1.01 s ✔ 200 bytes - uncompress - snappy-wasm 420251.6 ops/s 2.379527 us/op - 129 runs 0.810 s ✔ 200 bytes - uncompress - snappy-wasm - prealloc 1746167 ops/s 572.6830 ns/op - 529 runs 0.804 s ✔ 300 bytes - uncompress - snappyjs 441676.2 ops/s 2.264102 us/op - 898 runs 2.53 s ✔ 300 bytes - uncompress - snappy 551313.2 ops/s 1.813851 us/op - 336 runs 1.11 s ✔ 300 bytes - uncompress - snappy-wasm 494773.0 ops/s 2.021129 us/op - 203 runs 0.912 s ✔ 300 bytes - uncompress - snappy-wasm - prealloc 1528680 ops/s 654.1590 ns/op - 465 runs 0.805 s ✔ 400 bytes - uncompress - snappyjs 383746.1 ops/s 2.605890 us/op - 235 runs 1.11 s ✔ 400 bytes - uncompress - snappy 515986.6 ops/s 1.938035 us/op - 158 runs 0.809 s ✔ 400 bytes - uncompress - snappy-wasm 392947.8 ops/s 2.544867 us/op - 322 runs 1.32 s ✔ 400 bytes - uncompress - snappy-wasm - prealloc 1425978 ops/s 701.2730 ns/op - 721 runs 1.01 s ✔ 500 bytes - uncompress - snappyjs 330727.5 ops/s 3.023637 us/op - 173 runs 1.02 s ✔ 500 bytes - uncompress - snappy 513874.1 ops/s 1.946002 us/op - 157 runs 0.806 s ✔ 500 bytes - uncompress - snappy-wasm 389263.0 ops/s 2.568957 us/op - 161 runs 0.914 s ✔ 500 bytes - uncompress - snappy-wasm - prealloc 1330936 ops/s 751.3510 ns/op - 672 runs 1.01 s ✔ 1000 bytes - uncompress - snappyjs 241393.9 ops/s 4.142606 us/op - 126 runs 1.03 s ✔ 1000 bytes - uncompress - snappy 491119.6 ops/s 2.036164 us/op - 201 runs 0.911 s ✔ 1000 bytes - uncompress - snappy-wasm 361794.5 ops/s 2.764000 us/op - 148 runs 0.910 s ✔ 1000 bytes - uncompress - snappy-wasm - prealloc 959026.5 ops/s 1.042724 us/op - 390 runs 0.909 s ✔ 10000 bytes - uncompress - snappyjs 40519.03 ops/s 24.67976 us/op - 16 runs 0.913 s ✔ 10000 bytes - uncompress - snappy 202537.6 ops/s 4.937355 us/op - 796 runs 4.43 s ✔ 10000 bytes - uncompress - snappy-wasm 165017.6 ops/s 6.059960 us/op - 52 runs 0.822 s ✔ 10000 bytes - uncompress - snappy-wasm - prealloc 175061.5 ops/s 5.712277 us/op - 130 runs 1.25 s ✔ 100000 bytes - uncompress - snappyjs 4030.391 ops/s 248.1149 us/op - 12 runs 3.71 s ✔ 100000 bytes - uncompress - snappy 35459.43 ops/s 28.20124 us/op - 41 runs 1.67 s ✔ 100000 bytes - uncompress - snappy-wasm 22449.16 ops/s 44.54509 us/op - 13 runs 1.11 s ✔ 100000 bytes - uncompress - snappy-wasm - prealloc 27169.50 ops/s 36.80598 us/op - 13 runs 0.997 s ``` Closes #4170 --------- Co-authored-by: Nico Flaig <nflaig@protonmail.com>
1 parent 6b20ef5 commit 0a8e6e1

File tree

4 files changed

+213
-8
lines changed

4 files changed

+213
-8
lines changed

packages/beacon-node/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@
146146
"multiformats": "^11.0.1",
147147
"prom-client": "^15.1.0",
148148
"qs": "^6.11.1",
149-
"snappyjs": "^0.7.0",
149+
"@chainsafe/snappy-wasm": "^0.5.0",
150150
"strict-event-emitter-types": "^2.0.0",
151151
"systeminformation": "^5.22.9",
152152
"uint8arraylist": "^2.4.7",

packages/beacon-node/src/network/gossip/encoding.ts

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import {digest} from "@chainsafe/as-sha256";
22
import {RPC} from "@chainsafe/libp2p-gossipsub/message";
33
import {DataTransform} from "@chainsafe/libp2p-gossipsub/types";
4+
import snappyWasm from "@chainsafe/snappy-wasm";
45
import {Message} from "@libp2p/interface";
56
import {ForkName} from "@lodestar/params";
67
import {intToBytes} from "@lodestar/utils";
7-
import {compress, uncompress} from "snappyjs";
88
import xxhashFactory from "xxhash-wasm";
99
import {MESSAGE_DOMAIN_VALID_SNAPPY} from "./constants.js";
1010
import {GossipTopicCache, getGossipSSZType} from "./topic.js";
@@ -15,6 +15,10 @@ const xxhash = await xxhashFactory();
1515
// Use salt to prevent msgId from being mined for collisions
1616
const h64Seed = BigInt(Math.floor(Math.random() * 1e9));
1717

18+
// create singleton snappy encoder + decoder
19+
const encoder = new snappyWasm.Encoder();
20+
const decoder = new snappyWasm.Decoder();
21+
1822
// Shared buffer to convert msgId to string
1923
const sharedMsgIdBuf = Buffer.alloc(20);
2024

@@ -79,11 +83,12 @@ export class DataTransformSnappy implements DataTransform {
7983
* - `outboundTransform()`: compress snappy payload
8084
*/
8185
inboundTransform(topicStr: string, data: Uint8Array): Uint8Array {
82-
const uncompressedData = uncompress(data, this.maxSizePerMessage);
86+
// check uncompressed data length before we actually decompress
87+
const uncompressedDataLength = snappyWasm.decompress_len(data);
88+
if (uncompressedDataLength > this.maxSizePerMessage) {
89+
throw Error(`ssz_snappy decoded data length ${uncompressedDataLength} > ${this.maxSizePerMessage}`);
90+
}
8391

84-
// check uncompressed data length before we extract beacon block root, slot or
85-
// attestation data at later steps
86-
const uncompressedDataLength = uncompressedData.length;
8792
const topic = this.gossipTopicCache.getTopic(topicStr);
8893
const sszType = getGossipSSZType(topic);
8994

@@ -94,18 +99,24 @@ export class DataTransformSnappy implements DataTransform {
9499
throw Error(`ssz_snappy decoded data length ${uncompressedDataLength} > ${sszType.maxSize}`);
95100
}
96101

102+
// Only after saniy length checks, we can decompress the data
103+
const uncompressedData = Buffer.allocUnsafe(uncompressedDataLength);
104+
decoder.decompress_into(data, uncompressedData);
97105
return uncompressedData;
98106
}
99107

100108
/**
101109
* Takes the data to be published (a topic and associated data) transforms the data. The
102110
* transformed data will then be used to create a `RawGossipsubMessage` to be sent to peers.
103111
*/
112+
// No need to parse topic, everything is snappy compressed
104113
outboundTransform(_topicStr: string, data: Uint8Array): Uint8Array {
105114
if (data.length > this.maxSizePerMessage) {
106115
throw Error(`ssz_snappy encoded data length ${data.length} > ${this.maxSizePerMessage}`);
107116
}
108-
// No need to parse topic, everything is snappy compressed
109-
return compress(data);
117+
118+
const compressedData = Buffer.allocUnsafe(snappyWasm.max_compress_len(data.length));
119+
const compressedLen = encoder.compress_into(data, compressedData);
120+
return compressedData.subarray(0, compressedLen);
110121
}
111122
}
Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
import {randomBytes} from "node:crypto";
2+
import {bench, describe} from "@chainsafe/benchmark";
3+
import snappyWasm from "@chainsafe/snappy-wasm";
4+
import * as snappy from "snappy";
5+
import * as snappyjs from "snappyjs";
6+
7+
/* 2024-08-05 - Linux 5.15 x86_64 - Node.js v22.4.1
8+
9+
network / gossip / snappy
10+
compress
11+
✔ 100 bytes - compress - snappyjs 335566.9 ops/s 2.980032 us/op - 685 runs 2.54 s
12+
✔ 100 bytes - compress - snappy 388610.3 ops/s 2.573272 us/op - 870 runs 2.74 s
13+
✔ 100 bytes - compress - snappy-wasm 583254.0 ops/s 1.714519 us/op - 476 runs 1.32 s
14+
✔ 100 bytes - compress - snappy-wasm - prealloc 1586695 ops/s 630.2410 ns/op - 481 runs 0.804 s
15+
✔ 200 bytes - compress - snappyjs 298272.8 ops/s 3.352636 us/op - 213 runs 1.22 s
16+
✔ 200 bytes - compress - snappy 419528.0 ops/s 2.383631 us/op - 926 runs 2.71 s
17+
✔ 200 bytes - compress - snappy-wasm 472468.5 ops/s 2.116543 us/op - 577 runs 1.72 s
18+
✔ 200 bytes - compress - snappy-wasm - prealloc 1430445 ops/s 699.0830 ns/op - 868 runs 1.11 s
19+
✔ 300 bytes - compress - snappyjs 265124.9 ops/s 3.771807 us/op - 137 runs 1.02 s
20+
✔ 300 bytes - compress - snappy 361683.9 ops/s 2.764845 us/op - 1332 runs 4.18 s
21+
✔ 300 bytes - compress - snappy-wasm 443688.4 ops/s 2.253834 us/op - 859 runs 2.44 s
22+
✔ 300 bytes - compress - snappy-wasm - prealloc 1213825 ops/s 823.8420 ns/op - 370 runs 0.807 s
23+
✔ 400 bytes - compress - snappyjs 262168.5 ops/s 3.814341 us/op - 358 runs 1.87 s
24+
✔ 400 bytes - compress - snappy 382494.9 ops/s 2.614414 us/op - 1562 runs 4.58 s
25+
✔ 400 bytes - compress - snappy-wasm 406373.2 ops/s 2.460792 us/op - 797 runs 2.46 s
26+
✔ 400 bytes - compress - snappy-wasm - prealloc 1111715 ops/s 899.5110 ns/op - 450 runs 0.906 s
27+
✔ 500 bytes - compress - snappyjs 229213.1 ops/s 4.362753 us/op - 359 runs 2.07 s
28+
✔ 500 bytes - compress - snappy 373695.8 ops/s 2.675973 us/op - 2050 runs 5.99 s
29+
✔ 500 bytes - compress - snappy-wasm 714917.4 ops/s 1.398763 us/op - 960 runs 1.84 s
30+
✔ 500 bytes - compress - snappy-wasm - prealloc 1054619 ops/s 948.2100 ns/op - 427 runs 0.907 s
31+
✔ 1000 bytes - compress - snappyjs 148702.3 ops/s 6.724847 us/op - 171 runs 1.65 s
32+
✔ 1000 bytes - compress - snappy 423688.1 ops/s 2.360227 us/op - 525 runs 1.74 s
33+
✔ 1000 bytes - compress - snappy-wasm 524350.6 ops/s 1.907121 us/op - 273 runs 1.03 s
34+
✔ 1000 bytes - compress - snappy-wasm - prealloc 685191.5 ops/s 1.459446 us/op - 349 runs 1.01 s
35+
✔ 10000 bytes - compress - snappyjs 21716.92 ops/s 46.04704 us/op - 16 runs 1.24 s
36+
✔ 10000 bytes - compress - snappy 98051.32 ops/s 10.19874 us/op - 184 runs 2.39 s
37+
✔ 10000 bytes - compress - snappy-wasm 114681.8 ops/s 8.719783 us/op - 49 runs 0.937 s
38+
✔ 10000 bytes - compress - snappy-wasm - prealloc 111203.6 ops/s 8.992518 us/op - 49 runs 0.953 s
39+
✔ 100000 bytes - compress - snappyjs 2947.313 ops/s 339.2921 us/op - 12 runs 4.74 s
40+
✔ 100000 bytes - compress - snappy 14963.78 ops/s 66.82801 us/op - 70 runs 5.19 s
41+
✔ 100000 bytes - compress - snappy-wasm 19868.33 ops/s 50.33136 us/op - 14 runs 1.21 s
42+
✔ 100000 bytes - compress - snappy-wasm - prealloc 24579.34 ops/s 40.68457 us/op - 13 runs 1.06 s
43+
uncompress
44+
✔ 100 bytes - uncompress - snappyjs 589201.6 ops/s 1.697212 us/op - 242 runs 0.911 s
45+
✔ 100 bytes - uncompress - snappy 537424.1 ops/s 1.860728 us/op - 220 runs 0.910 s
46+
✔ 100 bytes - uncompress - snappy-wasm 634966.2 ops/s 1.574887 us/op - 194 runs 0.808 s
47+
✔ 100 bytes - uncompress - snappy-wasm - prealloc 1846964 ops/s 541.4290 ns/op - 559 runs 0.804 s
48+
✔ 200 bytes - uncompress - snappyjs 395141.8 ops/s 2.530737 us/op - 281 runs 1.22 s
49+
✔ 200 bytes - uncompress - snappy 536862.6 ops/s 1.862674 us/op - 274 runs 1.01 s
50+
✔ 200 bytes - uncompress - snappy-wasm 420251.6 ops/s 2.379527 us/op - 129 runs 0.810 s
51+
✔ 200 bytes - uncompress - snappy-wasm - prealloc 1746167 ops/s 572.6830 ns/op - 529 runs 0.804 s
52+
✔ 300 bytes - uncompress - snappyjs 441676.2 ops/s 2.264102 us/op - 898 runs 2.53 s
53+
✔ 300 bytes - uncompress - snappy 551313.2 ops/s 1.813851 us/op - 336 runs 1.11 s
54+
✔ 300 bytes - uncompress - snappy-wasm 494773.0 ops/s 2.021129 us/op - 203 runs 0.912 s
55+
✔ 300 bytes - uncompress - snappy-wasm - prealloc 1528680 ops/s 654.1590 ns/op - 465 runs 0.805 s
56+
✔ 400 bytes - uncompress - snappyjs 383746.1 ops/s 2.605890 us/op - 235 runs 1.11 s
57+
✔ 400 bytes - uncompress - snappy 515986.6 ops/s 1.938035 us/op - 158 runs 0.809 s
58+
✔ 400 bytes - uncompress - snappy-wasm 392947.8 ops/s 2.544867 us/op - 322 runs 1.32 s
59+
✔ 400 bytes - uncompress - snappy-wasm - prealloc 1425978 ops/s 701.2730 ns/op - 721 runs 1.01 s
60+
✔ 500 bytes - uncompress - snappyjs 330727.5 ops/s 3.023637 us/op - 173 runs 1.02 s
61+
✔ 500 bytes - uncompress - snappy 513874.1 ops/s 1.946002 us/op - 157 runs 0.806 s
62+
✔ 500 bytes - uncompress - snappy-wasm 389263.0 ops/s 2.568957 us/op - 161 runs 0.914 s
63+
✔ 500 bytes - uncompress - snappy-wasm - prealloc 1330936 ops/s 751.3510 ns/op - 672 runs 1.01 s
64+
✔ 1000 bytes - uncompress - snappyjs 241393.9 ops/s 4.142606 us/op - 126 runs 1.03 s
65+
✔ 1000 bytes - uncompress - snappy 491119.6 ops/s 2.036164 us/op - 201 runs 0.911 s
66+
✔ 1000 bytes - uncompress - snappy-wasm 361794.5 ops/s 2.764000 us/op - 148 runs 0.910 s
67+
✔ 1000 bytes - uncompress - snappy-wasm - prealloc 959026.5 ops/s 1.042724 us/op - 390 runs 0.909 s
68+
✔ 10000 bytes - uncompress - snappyjs 40519.03 ops/s 24.67976 us/op - 16 runs 0.913 s
69+
✔ 10000 bytes - uncompress - snappy 202537.6 ops/s 4.937355 us/op - 796 runs 4.43 s
70+
✔ 10000 bytes - uncompress - snappy-wasm 165017.6 ops/s 6.059960 us/op - 52 runs 0.822 s
71+
✔ 10000 bytes - uncompress - snappy-wasm - prealloc 175061.5 ops/s 5.712277 us/op - 130 runs 1.25 s
72+
✔ 100000 bytes - uncompress - snappyjs 4030.391 ops/s 248.1149 us/op - 12 runs 3.71 s
73+
✔ 100000 bytes - uncompress - snappy 35459.43 ops/s 28.20124 us/op - 41 runs 1.67 s
74+
✔ 100000 bytes - uncompress - snappy-wasm 22449.16 ops/s 44.54509 us/op - 13 runs 1.11 s
75+
✔ 100000 bytes - uncompress - snappy-wasm - prealloc 27169.50 ops/s 36.80598 us/op - 13 runs 0.997 s
76+
77+
*/
78+
79+
describe("network / gossip / snappy", () => {
80+
const msgLens = [
81+
// ->
82+
100,
83+
200,
84+
300,
85+
400,
86+
500,
87+
1000,
88+
10000, // 100000,
89+
];
90+
describe("compress", () => {
91+
const encoder = new snappyWasm.Encoder();
92+
93+
for (const msgLen of msgLens) {
94+
const uncompressed = randomBytes(msgLen);
95+
const RUNS_FACTOR = 1000;
96+
97+
bench({
98+
id: `${msgLen} bytes - compress - snappyjs`,
99+
runsFactor: RUNS_FACTOR,
100+
fn: () => {
101+
for (let i = 0; i < RUNS_FACTOR; i++) {
102+
snappyjs.compress(uncompressed);
103+
}
104+
},
105+
});
106+
107+
bench({
108+
id: `${msgLen} bytes - compress - snappy`,
109+
runsFactor: RUNS_FACTOR,
110+
fn: () => {
111+
for (let i = 0; i < RUNS_FACTOR; i++) {
112+
snappy.compressSync(uncompressed);
113+
}
114+
},
115+
});
116+
117+
bench({
118+
id: `${msgLen} bytes - compress - snappy-wasm`,
119+
runsFactor: RUNS_FACTOR,
120+
fn: () => {
121+
for (let i = 0; i < RUNS_FACTOR; i++) {
122+
encoder.compress(uncompressed);
123+
}
124+
},
125+
});
126+
127+
bench({
128+
id: `${msgLen} bytes - compress - snappy-wasm - prealloc`,
129+
runsFactor: RUNS_FACTOR,
130+
fn: () => {
131+
for (let i = 0; i < RUNS_FACTOR; i++) {
132+
let out = Buffer.allocUnsafe(snappyWasm.max_compress_len(uncompressed.length));
133+
const len = encoder.compress_into(uncompressed, out);
134+
out = out.subarray(0, len);
135+
}
136+
},
137+
});
138+
}
139+
});
140+
describe("uncompress", () => {
141+
const decoder = new snappyWasm.Decoder();
142+
143+
for (const msgLen of msgLens) {
144+
const uncompressed = randomBytes(msgLen);
145+
const compressed = snappyjs.compress(uncompressed);
146+
const RUNS_FACTOR = 1000;
147+
148+
bench({
149+
id: `${msgLen} bytes - uncompress - snappyjs`,
150+
runsFactor: RUNS_FACTOR,
151+
fn: () => {
152+
for (let i = 0; i < RUNS_FACTOR; i++) {
153+
snappyjs.uncompress(compressed);
154+
}
155+
},
156+
});
157+
158+
bench({
159+
id: `${msgLen} bytes - uncompress - snappy`,
160+
runsFactor: RUNS_FACTOR,
161+
fn: () => {
162+
for (let i = 0; i < RUNS_FACTOR; i++) {
163+
snappy.uncompressSync(compressed);
164+
}
165+
},
166+
});
167+
168+
bench({
169+
id: `${msgLen} bytes - uncompress - snappy-wasm`,
170+
runsFactor: RUNS_FACTOR,
171+
fn: () => {
172+
for (let i = 0; i < RUNS_FACTOR; i++) {
173+
decoder.decompress(compressed);
174+
}
175+
},
176+
});
177+
178+
bench({
179+
id: `${msgLen} bytes - uncompress - snappy-wasm - prealloc`,
180+
runsFactor: RUNS_FACTOR,
181+
fn: () => {
182+
for (let i = 0; i < RUNS_FACTOR; i++) {
183+
decoder.decompress_into(compressed, Buffer.allocUnsafe(snappyWasm.decompress_len(compressed)));
184+
}
185+
},
186+
});
187+
}
188+
});
189+
});

yarn.lock

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -750,6 +750,11 @@
750750
"@chainsafe/pubkey-index-map-linux-x64-gnu" "2.0.0"
751751
"@chainsafe/pubkey-index-map-win32-x64-msvc" "2.0.0"
752752

753+
"@chainsafe/snappy-wasm@^0.5.0":
754+
version "0.5.0"
755+
resolved "https://registry.yarnpkg.com/@chainsafe/snappy-wasm/-/snappy-wasm-0.5.0.tgz#067e534341ef746706e2dbf255bd7604c849be73"
756+
integrity sha512-ydXvhr9p+JjvzSSEyi6XExq8pHugFnrk70mk17T6mhDsklPvaXc+8K90G7TJF+u51lxI/fpv7MahrA5ayjFcSA==
757+
753758
"@chainsafe/ssz@^0.11.1":
754759
version "0.11.1"
755760
resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.11.1.tgz#d4aec883af2ec5196ae67b96242c467da20b2476"

0 commit comments

Comments
 (0)