Skip to content

Instantly share code, notes, and snippets.

@maurizi
Created April 28, 2022 13:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maurizi/dc78d915c7aace64c33aa554934f541b to your computer and use it in GitHub Desktop.
Save maurizi/dc78d915c7aace64c33aa554934f541b to your computer and use it in GitHub Desktop.
import Benchmark from "benchmark";
import S3 from "aws-sdk/clients/s3.js";
import Pbf from "pbf";
import { decode } from "topobuf";
import { deserialize } from "v8";
const s3 = new S3();
async function run(region) {
const v8response = await s3
.makeUnauthenticatedRequest("getObject", {
Bucket: "global-districtbuilder-dev-us-east-1",
Key: `${region}/topo.buf`
})
.promise();
const v8buffer = v8response.Body;
const topobufResponse = await s3
.makeUnauthenticatedRequest("getObject", {
Bucket: "global-districtbuilder-dev-us-east-1",
Key: `${region}/topo.pbf`
})
.promise();
const topobufBuffer = topobufResponse.Body;
const jsonResponse = await s3
.makeUnauthenticatedRequest("getObject", {
Bucket: "global-districtbuilder-dev-us-east-1",
Key: `${region}/topo.json`
})
.promise();
const jsonString = jsonResponse.Body;
// add tests
const suite = new Benchmark.Suite();
console.log(`starting tests for ${region}`);
suite
.add("v8", function () {
deserialize(v8buffer);
})
.add("topobuf", function () {
decode(new Pbf(topobufBuffer));
})
.add("json", function () {
JSON.parse(jsonString.toString("utf-8"));
})
// add listeners
.on("cycle", function (event) {
console.log(String(event.target));
})
.on("complete", function () {
console.log("Fastest is " + this.filter("fastest").map("name"));
})
// run async
.run({ async: true });
}
await run("regions/US/PA/2021-08-13T13:08:34.609Z");
await run("regions/US/NJ/2021-09-28T15:16:51.806Z");
await run("regions/US/DE/2021-08-13T09:33:21.756Z")
// Flags: --expose-gc
import S3 from "aws-sdk/clients/s3.js";
import Pbf from "pbf";
import { decode } from "topobuf";
import { deserialize } from "v8";
let times = 0;
// The largest rss size observed since last logging output.
let rssMax = 0;
// The absolute largest rss size seen.
let absoluteRssMax = 0;
const s3 = new S3();
let body;
async function downloadV8(region) {
const v8response = await s3
.makeUnauthenticatedRequest("getObject", {
Bucket: "global-districtbuilder-dev-us-east-1",
Key: `${region}/topo.buf`
})
.promise();
body = v8response.Body;
}
async function downloadTopobuf(region) {
const topobufResponse = await s3
.makeUnauthenticatedRequest("getObject", {
Bucket: "global-districtbuilder-dev-us-east-1",
Key: `${region}/topo.pbf`
})
.promise();
body = topobufResponse.Body;
}
async function downloadJson(region) {
const jsonResponse = await s3
.makeUnauthenticatedRequest("getObject", {
Bucket: "global-districtbuilder-dev-us-east-1",
Key: `${region}/topo.json`
})
.promise();
body = jsonResponse.Body;
}
function runV8() {
deserialize(body);
}
function runTopobuf() {
decode(new Pbf(body));
}
function runJson() {
JSON.parse(body.toString("utf-8"));
}
async function run(fn, msg) {
fn();
times++;
const rss = process.memoryUsage().rss;
rssMax = Math.max(rssMax, rss);
absoluteRssMax = Math.max(absoluteRssMax, rss);
if (times % 10 === 0) {
console.log(
times,
`${msg} rss - Since last: ${formatBytes(rssMax)} | Absolute: ${formatBytes(absoluteRssMax)}`
);
rssMax = 0;
}
}
export function formatBytes(bytes, decimals = 2) {
if (bytes === 0) return "0 Bytes";
const k = 1024;
const dm = decimals < 0 ? 0 : decimals;
const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;
}
async function gcAndWait(time = 10) {
await new Promise(resolve => {
setTimeout(() => {
resolve();
}, time);
});
gc();
await new Promise(resolve => {
setTimeout(() => {
resolve();
}, time);
});
}
async function runner(fn, msg) {
times = 0;
rssMax = 0;
absoluteRssMax = 0;
while (times < 50) {
await Promise.all([run(fn, msg), run(fn, msg), run(fn, msg), run(fn, msg), run(fn, msg)]);
await gcAndWait();
}
}
async function suite(region) {
console.log(`Running memory benchmark for ${region}`);
await downloadJson(region);
await gcAndWait(1000);
await runner(runJson, "JSON.parse");
await downloadTopobuf(region);
await gcAndWait(1000);
await runner(runTopobuf, "topobuf.decode");
await downloadV8(region);
await gcAndWait(1000);
await runner(runV8, "v8.deserialize");
}
await suite("regions/US/PA/2021-08-13T13:08:34.609Z");
await suite("regions/US/NJ/2021-09-28T15:16:51.806Z");
await suite("regions/US/DE/2021-08-13T09:33:21.756Z");
@maurizi
Copy link
Author

maurizi commented Apr 28, 2022

$ node --expose-gc test-memory.mjs && node test-cpu.mjs
Running memory benchmark for regions/US/PA/2021-08-13T13:08:34.609Z
10 JSON.parse rss - Since last: 2.92 GB | Absolute: 2.92 GB
20 JSON.parse rss - Since last: 2.92 GB | Absolute: 2.92 GB
30 JSON.parse rss - Since last: 2.92 GB | Absolute: 2.92 GB
40 JSON.parse rss - Since last: 2.92 GB | Absolute: 2.92 GB
50 JSON.parse rss - Since last: 2.92 GB | Absolute: 2.92 GB
10 topobuf.decode rss - Since last: 2.59 GB | Absolute: 2.59 GB
20 topobuf.decode rss - Since last: 1.83 GB | Absolute: 2.59 GB
30 topobuf.decode rss - Since last: 1.85 GB | Absolute: 2.59 GB
40 topobuf.decode rss - Since last: 1.83 GB | Absolute: 2.59 GB
50 topobuf.decode rss - Since last: 1.85 GB | Absolute: 2.59 GB
10 v8.deserialize rss - Since last: 3.91 GB | Absolute: 3.91 GB
20 v8.deserialize rss - Since last: 3.92 GB | Absolute: 3.92 GB
30 v8.deserialize rss - Since last: 3.92 GB | Absolute: 3.92 GB
40 v8.deserialize rss - Since last: 3.92 GB | Absolute: 3.92 GB
50 v8.deserialize rss - Since last: 3.91 GB | Absolute: 3.92 GB
Running memory benchmark for regions/US/NJ/2021-09-28T15:16:51.806Z
10 JSON.parse rss - Since last: 1.35 GB | Absolute: 1.35 GB
20 JSON.parse rss - Since last: 1.35 GB | Absolute: 1.35 GB
30 JSON.parse rss - Since last: 1.35 GB | Absolute: 1.35 GB
40 JSON.parse rss - Since last: 1.35 GB | Absolute: 1.35 GB
50 JSON.parse rss - Since last: 1.35 GB | Absolute: 1.35 GB
10 topobuf.decode rss - Since last: 1.24 GB | Absolute: 1.24 GB
20 topobuf.decode rss - Since last: 1.24 GB | Absolute: 1.24 GB
30 topobuf.decode rss - Since last: 1.24 GB | Absolute: 1.24 GB
40 topobuf.decode rss - Since last: 1.24 GB | Absolute: 1.24 GB
50 topobuf.decode rss - Since last: 1.24 GB | Absolute: 1.24 GB
10 v8.deserialize rss - Since last: 3.58 GB | Absolute: 3.58 GB
20 v8.deserialize rss - Since last: 2.71 GB | Absolute: 3.58 GB
30 v8.deserialize rss - Since last: 2.71 GB | Absolute: 3.58 GB
40 v8.deserialize rss - Since last: 2.71 GB | Absolute: 3.58 GB
50 v8.deserialize rss - Since last: 2.71 GB | Absolute: 3.58 GB
Running memory benchmark for regions/US/DE/2021-08-13T09:33:21.756Z
10 JSON.parse rss - Since last: 412.11 MB | Absolute: 412.11 MB
20 JSON.parse rss - Since last: 412.16 MB | Absolute: 412.16 MB
30 JSON.parse rss - Since last: 411.86 MB | Absolute: 412.16 MB
40 JSON.parse rss - Since last: 412.21 MB | Absolute: 412.21 MB
50 JSON.parse rss - Since last: 412.07 MB | Absolute: 412.21 MB
10 topobuf.decode rss - Since last: 408.38 MB | Absolute: 408.38 MB
20 topobuf.decode rss - Since last: 408.06 MB | Absolute: 408.38 MB
30 topobuf.decode rss - Since last: 407.44 MB | Absolute: 408.38 MB
40 topobuf.decode rss - Since last: 407.53 MB | Absolute: 408.38 MB
50 topobuf.decode rss - Since last: 407.9 MB | Absolute: 408.38 MB
10 v8.deserialize rss - Since last: 827.21 MB | Absolute: 827.21 MB
20 v8.deserialize rss - Since last: 827.03 MB | Absolute: 827.21 MB
30 v8.deserialize rss - Since last: 828.9 MB | Absolute: 828.9 MB
40 v8.deserialize rss - Since last: 826.71 MB | Absolute: 828.9 MB
50 v8.deserialize rss - Since last: 826.97 MB | Absolute: 828.9 MB


starting tests for regions/US/PA/2021-08-13T13:08:34.609Z
v8 x 0.08 ops/sec ±6.73% (5 runs sampled)
topobuf x 0.23 ops/sec ±15.57% (5 runs sampled)
json x 0.29 ops/sec ±5.15% (5 runs sampled)
Fastest is json
starting tests for regions/US/NJ/2021-09-28T15:16:51.806Z
v8 x 0.42 ops/sec ±24.03% (6 runs sampled)
topobuf x 0.42 ops/sec ±35.65% (5 runs sampled)
json x 0.80 ops/sec ±10.42% (6 runs sampled)
Fastest is json
starting tests for regions/US/DE/2021-08-13T09:33:21.756Z
v8 x 2.21 ops/sec ±16.38% (10 runs sampled)
topobuf x 3.98 ops/sec ±11.91% (14 runs sampled)
json x 6.11 ops/sec ±11.49% (21 runs sampled)
Fastest is json

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment