Skip to content

Commit

Permalink
perf: optimize hasTransferables, getTransferables, and getTransferable
Browse files Browse the repository at this point in the history
  • Loading branch information
okikio committed Nov 24, 2022
1 parent f986aed commit af9be28
Show file tree
Hide file tree
Showing 9 changed files with 719 additions and 415 deletions.
2 changes: 2 additions & 0 deletions .gitpod.Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ FROM gitpod/workspace-full:latest
#
# More information: https://www.gitpod.io/docs/config-docker/

RUN nvm install

RUN curl -fsSL https://deno.land/x/install/install.sh | sh
RUN /home/gitpod/.deno/bin/deno completions bash > /home/gitpod/.bashrc.d/90-deno && \
echo 'export DENO_INSTALL="/home/gitpod/.deno"' >> /home/gitpod/.bashrc.d/90-deno && \
Expand Down
36 changes: 21 additions & 15 deletions benchmark/bun.test.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,35 @@
import { MB, generateObj, add, perfs, timeFormatter } from "./utils";

import { it } from 'vitest';
import { getTransferables, hasTransferables } from "../src";
import { getTransferable, getTransferables, hasTransferables } from "../src";

import bytes from "pretty-bytes";
import { dmeanstdev } from '@stdlib/stats-base';

import Table from "cli-table3";

it("structuredClone", () => {
// `structuredClone`,
let head = [`hasTransferables`, `getTransferables`, `structuredClone (Transferable)`];

it("structuredClone", async () => {
let head = [`hasTransferables`, `getTransferable`, `getTransferable(s)`, `structuredClone (Transferable)`];
for (let cycle = 0; cycle < 5; cycle++) {
for (let i = 0; i < Math.log2(0.16 * MB); i++) {
for (let i = 0; i < Math.log2(1.6 * MB); i++) {
const num = Math.pow(2, i);
const sizeStr = bytes(num, { maximumFractionDigits: 3 });
const obj = generateObj(num / MB);
const obj = generateObj(num / MB, { streams: false });

let has: boolean | null = null;
await add(sizeStr, `hasTransferables`, () => {
has = hasTransferables(obj, true);
})

add(sizeStr, `hasTransferables`, () => {
hasTransferables(obj, 100, true);
let transferItt: any[] | null = null;
await add(sizeStr, `getTransferable`, () => {
transferItt = has ? Array.from(getTransferable(obj, true)) : [];
})

let transfer: any[] | null = null;
add(sizeStr, `getTransferables`, () => {
transfer = getTransferables(obj, 100, true);
let transferGen: any[] | null = null;
await add(sizeStr, `getTransferable(s)`, () => {
transferGen = has ? getTransferables(obj, true) : [];
})

// add(sizeStr, `structuredClone`, () => {
Expand All @@ -32,12 +38,13 @@ it("structuredClone", () => {
// } catch (e) { console.warn(e); }
// })

add(sizeStr, `structuredClone (Transferable)`, () => {
await add(sizeStr, `structuredClone (Transferable)`, () => {
try {
structuredClone(obj, transfer && transfer.length > 0 ? { transfer } : undefined);
structuredClone(obj, transferGen && transferGen.length > 0 ? { transfer: transferGen } : undefined);
} catch (e) { console.warn(e); }
})

await Promise.resolve();
}
console.log("\n")
}
Expand All @@ -48,7 +55,7 @@ it("structuredClone", () => {

perfs.forEach((variants, name) => {
let obj = {};
variants.forEach((durations, variant) => {
variants.forEach((durations = [0], variant) => {
const [mean, std] = dmeanstdev(durations.length, 0, new Float64Array(durations), 1, new Float64Array(2), 1);
obj[name] ??= [];
obj[name].push(`${timeFormatter.format(mean, "seconds")} ± ${timeFormatter.format(std, "seconds").replace("in ", "")}`);
Expand All @@ -59,4 +66,3 @@ it("structuredClone", () => {

console.log(table.toString())
})

34 changes: 21 additions & 13 deletions benchmark/deno.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { MB, generateObj, add, perfs, timeFormatter } from "./utils.ts";
import { getTransferables, hasTransferables } from "../src/index.ts";
import { getTransferable, getTransferables, hasTransferables } from "../src/index.ts";

// import { loading } from 'cli-loading-animation';
// const { start, stop } = loading('Loading..');
Expand All @@ -15,9 +15,9 @@ import dmeanstdev from 'https://cdn.skypack.dev/@stdlib/stats-base-dmeanstdev@0.
import Table from "http://esm.sh/cli-table3@0.6.3";

// `structuredClone`,
// let head = [`hasTransferables`, `getTransferables`, `structuredClone (Transferable)`];
// let head = [`hasTransferables`, `getTransferable`, `getTransferable(s)`, `structuredClone (Transferable)`];
// for (let cycle = 0; cycle < 5; cycle++) {
// for (let i = 0; i < Math.log2(0.16 * MB); i++) {
// for (let i = 0; i < Math.log2(1.6 * MB); i++) {
// const num = Math.pow(2, i);
// const sizeStr = bytes(num, { maximumFractionDigits: 3 });

Expand All @@ -26,13 +26,19 @@ import Table from "http://esm.sh/cli-table3@0.6.3";
// */
// const obj = generateObj(num / MB, { streams: false, channel: false });

// add(sizeStr, `hasTransferables`, () => {
// hasTransferables(obj, 100, true);
// let has: boolean | null = null;
// await add(sizeStr, `hasTransferables`, () => {
// has = hasTransferables(obj, true);
// })

// let transfer: any[] | null = null;
// add(sizeStr, `getTransferables`, () => {
// transfer = getTransferables(obj, 100, true);
// let transferItt: any[] | null = null;
// await add(sizeStr, `getTransferable`, () => {
// transferItt = has ? Array.from(getTransferable(obj, true)) : [];
// })

// let transferGen: any[] | null = null;
// await add(sizeStr, `getTransferable(s)`, () => {
// transferGen = has ? getTransferables(obj, true) : [];
// })

// // add(sizeStr, `structuredClone`, () => {
Expand All @@ -41,12 +47,14 @@ import Table from "http://esm.sh/cli-table3@0.6.3";
// // } catch (e) { console.warn(e); }
// // })

// add(sizeStr, `structuredClone (Transferable)`, () => {
// await add(sizeStr, `structuredClone (Transferable)`, () => {
// try {
// structuredClone(obj, transfer && transfer.length > 0 ? { transfer } : undefined);
// structuredClone(obj, transferGen && transferGen.length > 0 ? { transfer: transferGen } : undefined);
// } catch (e) { console.warn(e); }
// })

// await Promise.resolve();

// }
// console.log("\n")
// }
Expand Down Expand Up @@ -184,9 +192,9 @@ async function createWorkerPromise({ index, cycle = 0, variant }: ICreateWorkerI
// }
// stop();

const variants = ["postMessage", "postMessage (Transferable)"];
const variants = [`postMessage`, `hasTransferables`, `getTransferable`, `getTransferable(s)`];
const maxSize = 1;
for (let cycle = 0; cycle < 1; cycle++) {
for (let cycle = 0; cycle < 5; cycle++) {

const loadingId = loading(`Cycle ${cycle + 1}`);
for (let variant of variants) {
Expand All @@ -203,7 +211,7 @@ for (let cycle = 0; cycle < 1; cycle++) {
}


let head = [`postMessage`, `postMessage (Transferable)`];
let head = variants;
const table = new Table({ head: ["", ...head] });

let strVal = 'Map {\n'
Expand Down
28 changes: 21 additions & 7 deletions benchmark/deno.worker.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { MB, generateObj } from "./utils.ts";
import { getTransferables, hasTransferables } from "../src/index.ts";
import { getTransferable, getTransferables, hasTransferables } from "../src/index.ts";

self.onmessage = ({ data }) => {
const { name, variant, cycle, i } = data;
Expand All @@ -12,12 +12,26 @@ self.onmessage = ({ data }) => {

try {
let msg = { name, variant, cycle, i, obj };
if (variant == 'postMessage') {
self.postMessage(msg);
} else {
const transferables = getTransferables(obj, 100, true); // ) hasTransferables(obj, 100, true) ? : []
self.postMessage(msg, transferables);
switch (variant) {
case "postMessage": {
self.postMessage(msg);
break;
}
case "hasTransferables": {
hasTransferables(obj, true);
self.postMessage(msg);
break;
}
case "getTransferable": {
const transferItt: any[] | null = Array.from(getTransferable(obj, true));
self.postMessage(msg, transferItt);
break;
}
case "getTransferable(s)": {
const transferGen: any[] | null = getTransferables(obj, true);
self.postMessage(msg, transferGen);
break;
}
}
// console.log(data)
} catch (e) { console.warn(e); }
}
60 changes: 31 additions & 29 deletions benchmark/node.test.ts
Original file line number Diff line number Diff line change
@@ -1,32 +1,34 @@
import { MB, generateObj, add, perfs, timeFormatter } from "./utils";

import { it } from 'vitest';
import { getTransferables, hasTransferables } from "../src";
import { filterOutDuplicates, getTransferable, getTransferables, hasTransferables } from "../src";

import bytes from "pretty-bytes";
import { dmeanstdev } from '@stdlib/stats-base';

import Table from "cli-table3";

it("structuredClone", async () => {
// `structuredClone`,
let head = [`hasTransferables`, `getTransferables`, `structuredClone (Transferable)`];
// for (let cycle = 0; cycle < 4; cycle++) {
// for (let i = 0; i < Math.log2(1.6 * MB); i++) {
let i = 1;
let head = [`hasTransferables`, `getTransferable`, `getTransferable(s)`, `structuredClone (Transferable)`];
for (let cycle = 0; cycle < 5; cycle++) {
for (let i = 0; i < Math.log2(1.6 * MB); i++) {
const num = Math.pow(2, i);
const sizeStr = bytes(num, { maximumFractionDigits: 3 });
const obj = generateObj(num / MB, { streams: false });

let has;
let has: boolean | null = null;
await add(sizeStr, `hasTransferables`, () => {
has = hasTransferables(obj, 100, true);
has = hasTransferables(obj, true);
})

let transfer: any[] | null = null;
await add(sizeStr, `getTransferables`, () => {
transfer = has ? getTransferables(obj, 100, true) : [];
console.log(transfer)
let transferItt: any[] | null = null;
await add(sizeStr, `getTransferable`, () => {
transferItt = has ? Array.from(getTransferable(obj, true)) : [];
})

let transferGen: any[] | null = null;
await add(sizeStr, `getTransferable(s)`, () => {
transferGen = has ? getTransferables(obj, true) : [];
})

// add(sizeStr, `structuredClone`, () => {
Expand All @@ -37,29 +39,29 @@ it("structuredClone", async () => {

await add(sizeStr, `structuredClone (Transferable)`, () => {
try {
structuredClone(obj, transfer && transfer.length > 0 ? { transfer } : undefined);
structuredClone(obj, transferGen && transferGen.length > 0 ? { transfer: transferGen } : undefined);
} catch (e) { console.warn(e); }
})

await Promise.resolve();
// }
// console.log("\n")
// }
}
console.log("\n")
}

// const table = new Table({
// head: ["", ...head]
// });
const table = new Table({
head: ["", ...head]
});

// perfs.forEach((variants, name) => {
// let obj = {};
// variants.forEach((durations = [0], variant) => {
// const [mean, std] = dmeanstdev(durations.length, 0, new Float64Array(durations), 1, new Float64Array(2), 1);
// obj[name] ??= [];
// obj[name].push(`${timeFormatter.format(mean, "seconds")} ± ${timeFormatter.format(std, "seconds").replace("in ", "")}`);
perfs.forEach((variants, name) => {
let obj = {};
variants.forEach((durations = [0], variant) => {
const [mean, std] = dmeanstdev(durations.length, 0, new Float64Array(durations), 1, new Float64Array(2), 1);
obj[name] ??= [];
obj[name].push(`${timeFormatter.format(mean, "seconds")} ± ${timeFormatter.format(std, "seconds").replace("in ", "")}`);

// });
// table.push(obj);
// })
});
table.push(obj);
})

// console.log(table.toString())
console.log(table.toString())
})
16 changes: 8 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -116,25 +116,25 @@
},
"homepage": "https://github.com/okikio/transferables",
"devDependencies": {
"@commitlint/cli": "^17.2.0",
"@commitlint/config-conventional": "^17.2.0",
"@commitlint/cli": "^17.3.0",
"@commitlint/config-conventional": "^17.3.0",
"@semantic-release/changelog": "^6.0.1",
"@semantic-release/git": "^10.0.1",
"@stdlib/stats-base": "^0.0.7",
"@types/offscreencanvas": "^2019.7.0",
"@types/web": "^0.0.79",
"@types/web": "^0.0.80",
"cli-loading-animation": "^1.0.6",
"cli-table3": "^0.6.3",
"comlink": "^4.3.1",
"happy-dom": "^7.7.0",
"husky": "^8.0.2",
"pnpm": "^7.15.0",
"pnpm": "^7.17.0",
"pretty-bytes": "^6.0.0",
"semantic-release": "^19.0.5",
"typescript": "^4.8.4",
"typescript": "^4.9.3",
"ultra-runner": "^3.10.5",
"vite": "^3.2.3",
"vite-plugin-dts": "^1.7.0",
"vitest": "^0.25.1"
"vite": "^3.2.4",
"vite-plugin-dts": "^1.7.1",
"vitest": "^0.25.3"
}
}

0 comments on commit af9be28

Please sign in to comment.