Created
April 28, 2022 13:17
-
-
Save maurizi/dc78d915c7aace64c33aa554934f541b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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"); |
Author
maurizi
commented
Apr 28, 2022
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment