mirror of
https://github.com/oven-sh/bun
synced 2026-02-02 15:08:46 +00:00
3
bench/.env
Normal file
3
bench/.env
Normal file
@@ -0,0 +1,3 @@
|
||||
BUN=bun
|
||||
DENO=deno
|
||||
NODE=node
|
||||
2
bench/.gitignore
vendored
Normal file
2
bench/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
ffi/src/target
|
||||
ffi/src/*.node
|
||||
12
bench/README.md
Normal file
12
bench/README.md
Normal file
@@ -0,0 +1,12 @@
|
||||
```bash
|
||||
npm install
|
||||
|
||||
bun run ffi
|
||||
bun run gzip
|
||||
bun run async
|
||||
bun run sqlite
|
||||
|
||||
# to use custom version of bun/deno/node binary
|
||||
BUN=path/to/bun bun run ffi
|
||||
# or edit .env file
|
||||
```
|
||||
3
bench/async/.env
Normal file
3
bench/async/.env
Normal file
@@ -0,0 +1,3 @@
|
||||
BUN=bun
|
||||
DENO=deno
|
||||
NODE=node
|
||||
@@ -1,7 +1,7 @@
|
||||
import { run, bench } from "mitata";
|
||||
|
||||
bench("async", async () => 1);
|
||||
bench("sync", () => {});
|
||||
bench("async", async () => {});
|
||||
bench("await 1", async () => await 1);
|
||||
bench("noop", () => {});
|
||||
|
||||
await run();
|
||||
7
bench/async/deno.js
Normal file
7
bench/async/deno.js
Normal file
@@ -0,0 +1,7 @@
|
||||
import { run, bench } from "../node_modules/mitata/src/cli.mjs";
|
||||
|
||||
bench("sync", () => {});
|
||||
bench("async", async () => {});
|
||||
bench("await 1", async () => await 1);
|
||||
|
||||
await run();
|
||||
7
bench/async/node.mjs
Normal file
7
bench/async/node.mjs
Normal file
@@ -0,0 +1,7 @@
|
||||
import { run, bench } from "mitata";
|
||||
|
||||
bench("sync", () => {});
|
||||
bench("async", async () => {});
|
||||
bench("await 1", async () => await 1);
|
||||
|
||||
await run();
|
||||
11
bench/async/package.json
Normal file
11
bench/async/package.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"name": "bench",
|
||||
"scripts": {
|
||||
"deps": "exit 0",
|
||||
"build": "exit 0",
|
||||
"bench:bun": "$BUN bun.js",
|
||||
"bench:node": "$NODE node.mjs",
|
||||
"bench:deno": "$DENO run -A --unstable deno.js",
|
||||
"bench": "bun run bench:bun && bun run bench:node && bun run bench:deno"
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,12 @@
|
||||
// works in both bun & node
|
||||
import { readFileSync } from "node:fs";
|
||||
const count = parseInt(process.env.ITERATIONS || "1", 10) || 1;
|
||||
|
||||
const arg = process.argv.slice(1);
|
||||
|
||||
// TODO: remove Buffer.from() when readFileSync() returns Buffer
|
||||
|
||||
for (let i = 0; i < count; i++)
|
||||
console.log(arg.map((file) => readFileSync(file, "utf8")).join(""));
|
||||
console.log(
|
||||
arg.map((file) => Buffer.from(readFileSync(file, "utf8"))).join("")
|
||||
);
|
||||
@@ -1,4 +1,6 @@
|
||||
const path = require("path");
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
|
||||
const input = path.resolve(process.argv[process.argv.length - 1]);
|
||||
|
||||
fs.createReadStream(input).pipe(process.stdout);
|
||||
@@ -1,4 +1,5 @@
|
||||
import path from "path";
|
||||
const input = path.resolve(process.argv[process.argv.length - 2]);
|
||||
const output = path.resolve(process.argv[process.argv.length - 1]);
|
||||
|
||||
await Bun.write(Bun.file(output), Bun.file(input));
|
||||
4
bench/copyfile/node-streams.js
Normal file
4
bench/copyfile/node-streams.js
Normal file
@@ -0,0 +1,4 @@
|
||||
import { createReadStream, createWriteStream } from "node:fs";
|
||||
|
||||
const arg = process.argv.slice(2);
|
||||
createReadStream(arg[0]).pipe(createWriteStream(arg[1]));
|
||||
@@ -1,3 +1,5 @@
|
||||
import { copyFileSync } from "node:fs";
|
||||
|
||||
const arg = process.argv.slice(2);
|
||||
|
||||
copyFileSync(arg[0], arg[1]);
|
||||
3
bench/ffi/.env
Normal file
3
bench/ffi/.env
Normal file
@@ -0,0 +1,3 @@
|
||||
BUN=bun
|
||||
DENO=deno
|
||||
NODE=node
|
||||
33
bench/ffi/bun.js
Normal file
33
bench/ffi/bun.js
Normal file
@@ -0,0 +1,33 @@
|
||||
import { run, bench, group } from "mitata";
|
||||
import { ptr, dlopen, CString } from "bun:ffi";
|
||||
const { napiNoop, napiHash, napiString } = require("./src/ffi_napi_bench.node");
|
||||
|
||||
const {
|
||||
symbols: {
|
||||
ffi_noop: { native: ffi_noop },
|
||||
ffi_hash: { native: ffi_hash },
|
||||
ffi_string: { native: ffi_string },
|
||||
},
|
||||
} = dlopen("./src/ffi_napi_bench.node", {
|
||||
ffi_noop: { args: [], returns: "void" },
|
||||
ffi_string: { args: [], returns: "ptr" },
|
||||
ffi_hash: { args: ["ptr", "usize"], returns: "u32" },
|
||||
});
|
||||
|
||||
const bytes = new Uint8Array(64);
|
||||
|
||||
group("bun:ffi", () => {
|
||||
bench("noop", () => ffi_noop());
|
||||
bench("hash", () => ffi_hash(ptr(bytes), bytes.byteLength));
|
||||
|
||||
bench("c string", () => new CString(ffi_string()));
|
||||
});
|
||||
|
||||
group("bun:napi", () => {
|
||||
bench("noop", () => napiNoop());
|
||||
bench("hash", () => napiHash(bytes));
|
||||
|
||||
bench("string", () => napiString());
|
||||
});
|
||||
|
||||
await run();
|
||||
27
bench/ffi/deno.js
Normal file
27
bench/ffi/deno.js
Normal file
@@ -0,0 +1,27 @@
|
||||
import { run, bench, group } from "../node_modules/mitata/src/cli.mjs";
|
||||
|
||||
const extension = "darwin" !== Deno.build.os ? "so" : "dylib";
|
||||
const path = new URL(
|
||||
"src/target/release/libffi_napi_bench." + extension,
|
||||
import.meta.url
|
||||
).pathname;
|
||||
|
||||
const {
|
||||
symbols: { ffi_noop, ffi_hash, ffi_string },
|
||||
} = Deno.dlopen(path, {
|
||||
ffi_noop: { parameters: [], result: "void" },
|
||||
ffi_string: { parameters: [], result: "pointer" },
|
||||
ffi_hash: { parameters: ["pointer", "usize"], result: "u32" },
|
||||
});
|
||||
|
||||
const bytes = new Uint8Array(64);
|
||||
|
||||
group("deno:ffi", () => {
|
||||
bench("noop", () => ffi_noop());
|
||||
bench("hash", () => ffi_hash(bytes, bytes.byteLength));
|
||||
bench("c string", () =>
|
||||
new Deno.UnsafePointerView(ffi_string()).getCString()
|
||||
);
|
||||
});
|
||||
|
||||
await run();
|
||||
@@ -1,33 +0,0 @@
|
||||
import {
|
||||
viewSource,
|
||||
dlopen,
|
||||
CString,
|
||||
ptr,
|
||||
toBuffer,
|
||||
toArrayBuffer,
|
||||
FFIType,
|
||||
callback,
|
||||
} from "bun:ffi";
|
||||
|
||||
import { bench, group, run } from "mitata";
|
||||
|
||||
var buffer = new Uint8Array(32);
|
||||
var bufferPtr = ptr(buffer);
|
||||
var arrayBuffer = new ArrayBuffer(32);
|
||||
bench("ptr(Uint8Array)", () => {
|
||||
return ptr(buffer);
|
||||
});
|
||||
|
||||
bench("ptr(ArrayBuffer)", () => {
|
||||
return ptr(arrayBuffer);
|
||||
});
|
||||
|
||||
bench("toBuffer(ptr)", () => {
|
||||
return toBuffer(bufferPtr, 32);
|
||||
});
|
||||
|
||||
bench("toArrayBuffer(ptr)", () => {
|
||||
return toArrayBuffer(bufferPtr, 32);
|
||||
});
|
||||
|
||||
await run();
|
||||
@@ -1,419 +0,0 @@
|
||||
import {
|
||||
viewSource,
|
||||
dlopen,
|
||||
CString,
|
||||
ptr,
|
||||
toBuffer,
|
||||
toArrayBuffer,
|
||||
FFIType,
|
||||
callback,
|
||||
} from "bun:ffi";
|
||||
import { bench, group, run } from "mitata";
|
||||
|
||||
const types = {
|
||||
returns_true: {
|
||||
returns: "bool",
|
||||
args: [],
|
||||
},
|
||||
returns_false: {
|
||||
returns: "bool",
|
||||
args: [],
|
||||
},
|
||||
returns_42_char: {
|
||||
returns: "char",
|
||||
args: [],
|
||||
},
|
||||
// returns_42_float: {
|
||||
// returns: "float",
|
||||
// args: [],
|
||||
// },
|
||||
// returns_42_double: {
|
||||
// returns: "double",
|
||||
// args: [],
|
||||
// },
|
||||
returns_42_uint8_t: {
|
||||
returns: "uint8_t",
|
||||
args: [],
|
||||
},
|
||||
returns_neg_42_int8_t: {
|
||||
returns: "int8_t",
|
||||
args: [],
|
||||
},
|
||||
returns_42_uint16_t: {
|
||||
returns: "uint16_t",
|
||||
args: [],
|
||||
},
|
||||
returns_42_uint32_t: {
|
||||
returns: "uint32_t",
|
||||
args: [],
|
||||
},
|
||||
// // returns_42_uint64_t: {
|
||||
// // returns: "uint64_t",
|
||||
// // args: [],
|
||||
// // },
|
||||
returns_neg_42_int16_t: {
|
||||
returns: "int16_t",
|
||||
args: [],
|
||||
},
|
||||
returns_neg_42_int32_t: {
|
||||
returns: "int32_t",
|
||||
args: [],
|
||||
},
|
||||
// returns_neg_42_int64_t: {
|
||||
// returns: "int64_t",
|
||||
// args: [],
|
||||
// },
|
||||
|
||||
identity_char: {
|
||||
returns: "char",
|
||||
args: ["char"],
|
||||
},
|
||||
// identity_float: {
|
||||
// returns: "float",
|
||||
// args: ["float"],
|
||||
// },
|
||||
identity_bool: {
|
||||
returns: "bool",
|
||||
args: ["bool"],
|
||||
},
|
||||
// identity_double: {
|
||||
// returns: "double",
|
||||
// args: ["double"],
|
||||
// },
|
||||
identity_int8_t: {
|
||||
returns: "int8_t",
|
||||
args: ["int8_t"],
|
||||
},
|
||||
identity_int16_t: {
|
||||
returns: "int16_t",
|
||||
args: ["int16_t"],
|
||||
},
|
||||
identity_int32_t: {
|
||||
returns: "int32_t",
|
||||
args: ["int32_t"],
|
||||
},
|
||||
// identity_int64_t: {
|
||||
// returns: "int64_t",
|
||||
// args: ["int64_t"],
|
||||
// },
|
||||
identity_uint8_t: {
|
||||
returns: "uint8_t",
|
||||
args: ["uint8_t"],
|
||||
},
|
||||
identity_uint16_t: {
|
||||
returns: "uint16_t",
|
||||
args: ["uint16_t"],
|
||||
},
|
||||
identity_uint32_t: {
|
||||
returns: "uint32_t",
|
||||
args: ["uint32_t"],
|
||||
},
|
||||
// identity_uint64_t: {
|
||||
// returns: "uint64_t",
|
||||
// args: ["uint64_t"],
|
||||
// },
|
||||
|
||||
add_char: {
|
||||
returns: "char",
|
||||
args: ["char", "char"],
|
||||
},
|
||||
add_float: {
|
||||
returns: "float",
|
||||
args: ["float", "float"],
|
||||
},
|
||||
add_double: {
|
||||
returns: "double",
|
||||
args: ["double", "double"],
|
||||
},
|
||||
add_int8_t: {
|
||||
returns: "int8_t",
|
||||
args: ["int8_t", "int8_t"],
|
||||
},
|
||||
add_int16_t: {
|
||||
returns: "int16_t",
|
||||
args: ["int16_t", "int16_t"],
|
||||
},
|
||||
add_int32_t: {
|
||||
returns: "int32_t",
|
||||
args: ["int32_t", "int32_t"],
|
||||
},
|
||||
// add_int64_t: {
|
||||
// returns: "int64_t",
|
||||
// args: ["int64_t", "int64_t"],
|
||||
// },
|
||||
add_uint8_t: {
|
||||
returns: "uint8_t",
|
||||
args: ["uint8_t", "uint8_t"],
|
||||
},
|
||||
add_uint16_t: {
|
||||
returns: "uint16_t",
|
||||
args: ["uint16_t", "uint16_t"],
|
||||
},
|
||||
add_uint32_t: {
|
||||
returns: "uint32_t",
|
||||
args: ["uint32_t", "uint32_t"],
|
||||
},
|
||||
|
||||
does_pointer_equal_42_as_int32_t: {
|
||||
returns: "bool",
|
||||
args: ["ptr"],
|
||||
},
|
||||
|
||||
ptr_should_point_to_42_as_int32_t: {
|
||||
returns: "ptr",
|
||||
args: [],
|
||||
},
|
||||
identity_ptr: {
|
||||
returns: "ptr",
|
||||
args: ["ptr"],
|
||||
},
|
||||
// add_uint64_t: {
|
||||
// returns: "uint64_t",
|
||||
// args: ["uint64_t", "uint64_t"],
|
||||
// },
|
||||
|
||||
cb_identity_true: {
|
||||
returns: "bool",
|
||||
args: ["ptr"],
|
||||
},
|
||||
cb_identity_false: {
|
||||
returns: "bool",
|
||||
args: ["ptr"],
|
||||
},
|
||||
cb_identity_42_char: {
|
||||
returns: "char",
|
||||
args: ["ptr"],
|
||||
},
|
||||
// cb_identity_42_float: {
|
||||
// returns: "float",
|
||||
// args: ["ptr"],
|
||||
// },
|
||||
// cb_identity_42_double: {
|
||||
// returns: "double",
|
||||
// args: ["ptr"],
|
||||
// },
|
||||
cb_identity_42_uint8_t: {
|
||||
returns: "uint8_t",
|
||||
args: ["ptr"],
|
||||
},
|
||||
cb_identity_neg_42_int8_t: {
|
||||
returns: "int8_t",
|
||||
args: ["ptr"],
|
||||
},
|
||||
cb_identity_42_uint16_t: {
|
||||
returns: "uint16_t",
|
||||
args: ["ptr"],
|
||||
},
|
||||
cb_identity_42_uint32_t: {
|
||||
returns: "uint32_t",
|
||||
args: ["ptr"],
|
||||
},
|
||||
// cb_identity_42_uint64_t: {
|
||||
// returns: "uint64_t",
|
||||
// args: ["ptr"],
|
||||
// },
|
||||
cb_identity_neg_42_int16_t: {
|
||||
returns: "int16_t",
|
||||
args: ["ptr"],
|
||||
},
|
||||
cb_identity_neg_42_int32_t: {
|
||||
returns: "int32_t",
|
||||
args: ["ptr"],
|
||||
},
|
||||
// cb_identity_neg_42_int64_t: {
|
||||
// returns: "int64_t",
|
||||
// args: ["ptr"],
|
||||
// },
|
||||
|
||||
return_a_function_ptr_to_function_that_returns_true: {
|
||||
returns: "ptr",
|
||||
args: [],
|
||||
},
|
||||
};
|
||||
|
||||
const {
|
||||
symbols: {
|
||||
returns_true,
|
||||
returns_false,
|
||||
return_a_function_ptr_to_function_that_returns_true,
|
||||
returns_42_char,
|
||||
returns_42_float,
|
||||
returns_42_double,
|
||||
returns_42_uint8_t,
|
||||
returns_neg_42_int8_t,
|
||||
returns_42_uint16_t,
|
||||
returns_42_uint32_t,
|
||||
returns_42_uint64_t,
|
||||
returns_neg_42_int16_t,
|
||||
returns_neg_42_int32_t,
|
||||
returns_neg_42_int64_t,
|
||||
identity_char,
|
||||
identity_float,
|
||||
identity_bool,
|
||||
identity_double,
|
||||
identity_int8_t,
|
||||
identity_int16_t,
|
||||
identity_int32_t,
|
||||
identity_int64_t,
|
||||
identity_uint8_t,
|
||||
identity_uint16_t,
|
||||
identity_uint32_t,
|
||||
identity_uint64_t,
|
||||
add_char,
|
||||
add_float,
|
||||
add_double,
|
||||
add_int8_t,
|
||||
add_int16_t,
|
||||
add_int32_t,
|
||||
add_int64_t,
|
||||
add_uint8_t,
|
||||
add_uint16_t,
|
||||
identity_ptr,
|
||||
add_uint32_t,
|
||||
add_uint64_t,
|
||||
does_pointer_equal_42_as_int32_t,
|
||||
ptr_should_point_to_42_as_int32_t,
|
||||
cb_identity_true,
|
||||
cb_identity_false,
|
||||
cb_identity_42_char,
|
||||
cb_identity_42_float,
|
||||
cb_identity_42_double,
|
||||
cb_identity_42_uint8_t,
|
||||
cb_identity_neg_42_int8_t,
|
||||
cb_identity_42_uint16_t,
|
||||
cb_identity_42_uint32_t,
|
||||
cb_identity_42_uint64_t,
|
||||
cb_identity_neg_42_int16_t,
|
||||
cb_identity_neg_42_int32_t,
|
||||
cb_identity_neg_42_int64_t,
|
||||
},
|
||||
close,
|
||||
} = dlopen("/tmp/bun-ffi-test.dylib", types);
|
||||
|
||||
group("add_char", () => {
|
||||
bench("add_char (raw)", () => raw_add_char(1, 1));
|
||||
bench("add_char", () => add_char(1, 1));
|
||||
});
|
||||
group("add_int16_t", () => {
|
||||
bench("add_int16_t (raw)", () => raw_add_int16_t(1, 1));
|
||||
bench("add_int16_t", () => add_int16_t(1, 1));
|
||||
});
|
||||
group("add_int32_t", () => {
|
||||
bench("add_int32_t (raw)", () => raw_add_int32_t(1, 1));
|
||||
bench("add_int32_t", () => add_int32_t(1, 1));
|
||||
});
|
||||
group("add_int8_t", () => {
|
||||
bench("add_int8_t (raw)", () => raw_add_int8_t(1, 1));
|
||||
bench("add_int8_t", () => add_int8_t(1, 1));
|
||||
});
|
||||
group("add_uint16_t", () => {
|
||||
bench("add_uint16_t (raw)", () => raw_add_uint16_t(1, 1));
|
||||
bench("add_uint16_t", () => add_uint16_t(1, 1));
|
||||
});
|
||||
group("add_uint32_t", () => {
|
||||
bench("add_uint32_t (raw)", () => raw_add_uint32_t(1, 1));
|
||||
bench("add_uint32_t", () => add_uint32_t(1, 1));
|
||||
});
|
||||
group("add_uint8_t", () => {
|
||||
bench("add_uint8_t (raw)", () => raw_add_uint8_t(1, 1));
|
||||
bench("add_uint8_t", () => add_uint8_t(1, 1));
|
||||
});
|
||||
group("identity_bool", () => {
|
||||
bench("identity_bool (raw)", () => raw_identity_bool(false));
|
||||
bench("identity_bool", () => identity_bool(true));
|
||||
});
|
||||
group("identity_char", () => {
|
||||
bench("identity_char (raw)", () => raw_identity_char(10));
|
||||
bench("identity_char", () => identity_char(10));
|
||||
});
|
||||
group("identity_int16_t", () => {
|
||||
bench("identity_int16_t (raw)", () => raw_identity_int16_t(10));
|
||||
bench("identity_int16_t", () => identity_int16_t(10));
|
||||
});
|
||||
group("identity_int32_t", () => {
|
||||
bench("identity_int32_t (raw)", () => raw_identity_int32_t(10));
|
||||
bench("identity_int32_t", () => identity_int32_t(10));
|
||||
});
|
||||
group("identity_int8_t", () => {
|
||||
bench("identity_int8_t (raw)", () => raw_identity_int8_t(10));
|
||||
bench("identity_int8_t", () => identity_int8_t(10));
|
||||
});
|
||||
group("identity_uint16_t", () => {
|
||||
bench("identity_uint16_t (raw)", () => raw_identity_uint16_t(10));
|
||||
bench("identity_uint16_t", () => identity_uint16_t(10));
|
||||
});
|
||||
group("identity_uint32_t", () => {
|
||||
bench("identity_uint32_t (raw)", () => raw_identity_uint32_t(10));
|
||||
bench("identity_uint32_t", () => identity_uint32_t(10));
|
||||
});
|
||||
group("identity_uint8_t", () => {
|
||||
bench("identity_uint8_t (raw)", () => raw_identity_uint8_t(10));
|
||||
bench("identity_uint8_t", () => identity_uint8_t(10));
|
||||
});
|
||||
group("returns_42_char", () => {
|
||||
bench("returns_42_char (raw)", () => raw_returns_42_char());
|
||||
bench("returns_42_char", () => returns_42_char());
|
||||
});
|
||||
group("returns_42_uint16_t", () => {
|
||||
bench("returns_42_uint16_t (raw)", () => raw_returns_42_uint16_t());
|
||||
bench("returns_42_uint16_t", () => returns_42_uint16_t());
|
||||
});
|
||||
group("returns_42_uint32_t", () => {
|
||||
bench("returns_42_uint32_t (raw)", () => raw_returns_42_uint32_t());
|
||||
bench("returns_42_uint32_t", () => returns_42_uint32_t());
|
||||
});
|
||||
group("returns_42_uint8_t", () => {
|
||||
bench("returns_42_uint8_t (raw)", () => raw_returns_42_uint8_t());
|
||||
bench("returns_42_uint8_t", () => returns_42_uint8_t());
|
||||
});
|
||||
group("returns_false", () => {
|
||||
bench("returns_false (raw)", () => raw_returns_false());
|
||||
bench("returns_false", () => returns_false());
|
||||
});
|
||||
group("returns_neg_42_int16_t", () => {
|
||||
bench("returns_neg_42_int16_t (raw)", () => raw_returns_neg_42_int16_t());
|
||||
bench("returns_neg_42_int16_t", () => returns_neg_42_int16_t());
|
||||
});
|
||||
group("returns_neg_42_int32_t", () => {
|
||||
bench("returns_neg_42_int32_t (raw)", () => raw_returns_neg_42_int32_t());
|
||||
bench("returns_neg_42_int32_t", () => returns_neg_42_int32_t());
|
||||
});
|
||||
group("returns_neg_42_int8_t", () => {
|
||||
bench("returns_neg_42_int8_t (raw)", () => raw_returns_neg_42_int8_t());
|
||||
bench("returns_neg_42_int8_t", () => returns_neg_42_int8_t());
|
||||
});
|
||||
group("returns_true", () => {
|
||||
bench("returns_true (raw)", () => raw_returns_true());
|
||||
bench("returns_true", () => returns_true());
|
||||
});
|
||||
|
||||
var raw_returns_true = returns_true.native ?? returns_true;
|
||||
var raw_returns_false = returns_false.native ?? returns_false;
|
||||
var raw_returns_42_char = returns_42_char.native ?? returns_42_char;
|
||||
var raw_returns_42_uint8_t = returns_42_uint8_t.native ?? returns_42_uint8_t;
|
||||
var raw_returns_neg_42_int8_t =
|
||||
returns_neg_42_int8_t.native ?? returns_neg_42_int8_t;
|
||||
var raw_returns_42_uint16_t = returns_42_uint16_t.native ?? returns_42_uint16_t;
|
||||
var raw_returns_42_uint32_t = returns_42_uint32_t.native ?? returns_42_uint32_t;
|
||||
var raw_returns_neg_42_int16_t =
|
||||
returns_neg_42_int16_t.native ?? returns_neg_42_int16_t;
|
||||
var raw_returns_neg_42_int32_t =
|
||||
returns_neg_42_int32_t.native ?? returns_neg_42_int32_t;
|
||||
var raw_identity_char = identity_char.native ?? identity_char;
|
||||
var raw_identity_bool = identity_bool.native ?? identity_bool;
|
||||
var raw_identity_bool = identity_bool.native ?? identity_bool;
|
||||
var raw_identity_int8_t = identity_int8_t.native ?? identity_int8_t;
|
||||
var raw_identity_int16_t = identity_int16_t.native ?? identity_int16_t;
|
||||
var raw_identity_int32_t = identity_int32_t.native ?? identity_int32_t;
|
||||
var raw_identity_uint8_t = identity_uint8_t.native ?? identity_uint8_t;
|
||||
var raw_identity_uint16_t = identity_uint16_t.native ?? identity_uint16_t;
|
||||
var raw_identity_uint32_t = identity_uint32_t.native ?? identity_uint32_t;
|
||||
var raw_add_char = add_char.native ?? add_char;
|
||||
var raw_add_int8_t = add_int8_t.native ?? add_int8_t;
|
||||
var raw_add_int16_t = add_int16_t.native ?? add_int16_t;
|
||||
var raw_add_int32_t = add_int32_t.native ?? add_int32_t;
|
||||
var raw_add_uint8_t = add_uint8_t.native ?? add_uint8_t;
|
||||
var raw_add_uint16_t = add_uint16_t.native ?? add_uint16_t;
|
||||
var raw_add_uint32_t = add_uint32_t.native ?? add_uint32_t;
|
||||
|
||||
run({ collect: false, percentiles: true });
|
||||
16
bench/ffi/node.mjs
Normal file
16
bench/ffi/node.mjs
Normal file
@@ -0,0 +1,16 @@
|
||||
import { run, bench, group } from "mitata";
|
||||
import { createRequire } from "node:module";
|
||||
|
||||
const require = createRequire(import.meta.url);
|
||||
const { napiNoop, napiHash, napiString } = require("./src/ffi_napi_bench.node");
|
||||
|
||||
const bytes = new Uint8Array(64);
|
||||
|
||||
group("napi", () => {
|
||||
bench("noop", () => napiNoop());
|
||||
bench("hash", () => napiHash(bytes));
|
||||
|
||||
bench("string", () => napiString());
|
||||
});
|
||||
|
||||
await run();
|
||||
@@ -1,5 +0,0 @@
|
||||
// clang -O3 -shared -mtune=native ./noop.c -o noop.dylib
|
||||
|
||||
void noop();
|
||||
|
||||
void noop() {}
|
||||
Binary file not shown.
@@ -1,15 +0,0 @@
|
||||
import { dlopen } from "bun:ffi";
|
||||
import { bench, run } from "mitata";
|
||||
|
||||
const {
|
||||
symbols: { noop },
|
||||
} = dlopen("./noop.dylib", {
|
||||
noop: {
|
||||
args: [],
|
||||
returns: "void",
|
||||
},
|
||||
});
|
||||
bench("noop", () => {
|
||||
noop();
|
||||
});
|
||||
run({ collect: false, percentiles: true });
|
||||
11
bench/ffi/package.json
Normal file
11
bench/ffi/package.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"name": "bench",
|
||||
"scripts": {
|
||||
"bench:bun": "$BUN bun.js",
|
||||
"bench:node": "$NODE node.mjs",
|
||||
"deps": "cd src && bun run deps",
|
||||
"build": "cd src && bun run build",
|
||||
"bench:deno": "$DENO run -A --unstable deno.js",
|
||||
"bench": "bun run bench:bun && bun run bench:node && bun run bench:deno"
|
||||
}
|
||||
}
|
||||
1
bench/ffi/plus100/.gitignore
vendored
1
bench/ffi/plus100/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
./napi-plus100
|
||||
@@ -1,37 +0,0 @@
|
||||
## FFI overhead comparison
|
||||
|
||||
This compares the cost of simple function calls going from JavaScript to native code and back in:
|
||||
|
||||
- Bun v0.0.79
|
||||
- napi.rs (Node v17.7.1)
|
||||
- Deno v1.21.1
|
||||
|
||||
To set up:
|
||||
|
||||
```bash
|
||||
bun setup
|
||||
```
|
||||
|
||||
To run the benchmark:
|
||||
|
||||
```bash
|
||||
bun bench
|
||||
```
|
||||
|
||||
**add 100 to a number**:
|
||||
|
||||
| Overhead | Using | Version | Platform |
|
||||
| -------- | ------- | ------- | --------------- |
|
||||
| 7ns | bun:ffi | 0.0.79 | macOS (aarch64) |
|
||||
| 18ns | napi.rs | 17.7.1 | macOS (aarch64) |
|
||||
| 580ns | Deno | 1.21.1 | macOS (aarch64) |
|
||||
|
||||
**function that does nothing**:
|
||||
|
||||
| Overhead | Using | Version | Platform |
|
||||
| -------- | ------- | ------- | --------------- |
|
||||
| 3ns | bun:ffi | 0.0.79 | macOS (aarch64) |
|
||||
| 15ns | napi.rs | 17.7.1 | macOS (aarch64) |
|
||||
| 431ns | Deno | 1.21.1 | macOS (aarch64) |
|
||||
|
||||
The native [functions](./plus100.c) called in Deno & Bun are the same. The function called with napi.rs is based on napi's official [package-template](https://github.com/napi-rs/package-template) in https://github.com/Jarred-Sumner/napi-plus100
|
||||
@@ -1,49 +0,0 @@
|
||||
import { run, bench, group, baseline } from "mitata";
|
||||
import { dlopen, suffix } from "bun:ffi";
|
||||
import { readdirSync } from "fs";
|
||||
|
||||
const {
|
||||
symbols: {
|
||||
add3: { native: add3 },
|
||||
noop,
|
||||
},
|
||||
close,
|
||||
} = dlopen(`./plus100.dylib`, {
|
||||
add3: {
|
||||
args: ["int32_t", "int32_t", "int32_t"],
|
||||
returns: "int32_t",
|
||||
},
|
||||
noop: {
|
||||
args: [],
|
||||
},
|
||||
});
|
||||
const { add3: add3napi, noop: noopNapi } = require("./plus100-napi/index.js");
|
||||
|
||||
group("add3", () => {
|
||||
bench("add3(1,2,3) ffi", () => {
|
||||
add3(1, 2, 3);
|
||||
});
|
||||
|
||||
bench("add3(1,2,3) napi", () => {
|
||||
add3napi(1, 2, 3);
|
||||
});
|
||||
});
|
||||
|
||||
group("noop", () => {
|
||||
bench("noop() ffi", () => {
|
||||
noop();
|
||||
});
|
||||
|
||||
bench("noop() napi", () => {
|
||||
noopNapi();
|
||||
});
|
||||
});
|
||||
|
||||
// collect option collects benchmark returned values into array
|
||||
// prevents gc and can help with jit optimizing out functions
|
||||
await run({ collect: false, percentiles: true });
|
||||
console.log("\n");
|
||||
|
||||
if (add3(1, 2, 3) !== 1 + 2 + 3) {
|
||||
throw new Error("add3(1) !== 101");
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
import { run, bench, group, baseline } from "https://esm.sh/mitata";
|
||||
|
||||
const {
|
||||
symbols: { add3: add3, noop },
|
||||
close,
|
||||
} = Deno.dlopen("./plus100.dylib", {
|
||||
add3: {
|
||||
parameters: ["i32", "i32", "i32"],
|
||||
result: "i32",
|
||||
},
|
||||
noop: {
|
||||
parameters: [],
|
||||
result: "void",
|
||||
},
|
||||
});
|
||||
bench("add3(1,2,3) ", () => {
|
||||
add3(1, 2, 3);
|
||||
});
|
||||
|
||||
bench("noop() ", () => {
|
||||
noop();
|
||||
});
|
||||
|
||||
// collect option collects benchmark returned values into array
|
||||
// prevents gc and can help with jit optimizing out functions
|
||||
await run({ collect: false, percentiles: true });
|
||||
|
||||
if (add3(1, 2, 3) !== 1 + 2 + 3) {
|
||||
throw new Error("add3(1) !== 101");
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
import { bench, run } from "mitata";
|
||||
|
||||
const { add3, noop } =
|
||||
"Bun" in globalThis
|
||||
? require("./plus100-napi")
|
||||
: (await import("module")).createRequire(import.meta.url)("./plus100-napi");
|
||||
|
||||
bench("add3(1,2,3) napi", () => {
|
||||
add3(1, 2, 3);
|
||||
});
|
||||
bench("noop() napi", () => {
|
||||
noop();
|
||||
});
|
||||
await run({ collect: false, percentiles: true });
|
||||
console.log("\n");
|
||||
|
||||
if (add3(1, 2, 3) !== 1 + 2 + 3) {
|
||||
throw new Error("plus100(1) !== 101");
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
rm -rf plus100-napi
|
||||
git clone https://github.com/Jarred-Sumner/napi-plus100 plus100-napi --depth=1
|
||||
cd plus100-napi
|
||||
npm install
|
||||
npm run build
|
||||
Binary file not shown.
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"name": "plus100",
|
||||
"scripts": {
|
||||
"setup": "bun run napi-setup && bun run compile",
|
||||
"bench-deno": "deno run --allow-ffi --unstable -A plus100.deno.js",
|
||||
"napi-setup": "bash download-napi-plus100.sh",
|
||||
"bench-napi": "node plus100.napi.mjs",
|
||||
"bench-bun": "bun ./plus100.bun.js",
|
||||
"compile": "clang -mtune=native -O3 -shared ./plus100.c -o plus100.dylib",
|
||||
"bench": "bun run bench-bun && bun run bench-napi && bun run bench-deno"
|
||||
}
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
import { run, bench, group, baseline } from "mitata";
|
||||
import { dlopen, suffix } from "bun:ffi";
|
||||
import { readdirSync } from "fs";
|
||||
|
||||
const {
|
||||
symbols: {
|
||||
plus100: { native: plus100 },
|
||||
noop,
|
||||
},
|
||||
close,
|
||||
} = dlopen(`./plus100.dylib`, {
|
||||
plus100: {
|
||||
args: ["int32_t"],
|
||||
returns: "int32_t",
|
||||
},
|
||||
noop: {
|
||||
args: [],
|
||||
},
|
||||
});
|
||||
const {
|
||||
plus100: plus100napi,
|
||||
noop: noopNapi,
|
||||
} = require("./plus100-napi/index.js");
|
||||
|
||||
group("plus100", () => {
|
||||
bench("plus100(1) ffi", () => {
|
||||
plus100(1);
|
||||
});
|
||||
|
||||
bench("plus100(1) napi", () => {
|
||||
plus100napi(1);
|
||||
});
|
||||
});
|
||||
|
||||
group("noop", () => {
|
||||
bench("noop() ffi", () => {
|
||||
noop();
|
||||
});
|
||||
|
||||
bench("noop() napi", () => {
|
||||
noopNapi();
|
||||
});
|
||||
});
|
||||
|
||||
// collect option collects benchmark returned values into array
|
||||
// prevents gc and can help with jit optimizing out functions
|
||||
await run({ collect: false, percentiles: true });
|
||||
console.log("\n");
|
||||
|
||||
if (plus100(1) !== 101) {
|
||||
throw new Error("plus100(1) !== 101");
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
// clang -mtune=native -O3 -shared ./plus100.c -o plus100.dylib
|
||||
#include <stdint.h>
|
||||
|
||||
int32_t plus100(int32_t a);
|
||||
int32_t plus100(int32_t a) { return a + 100; }
|
||||
int32_t add3(int32_t a, int32_t b, int32_t c) { return a + b + c; }
|
||||
|
||||
void noop(void);
|
||||
void noop(void) {}
|
||||
@@ -1,30 +0,0 @@
|
||||
import { run, bench, group, baseline } from "https://esm.sh/mitata";
|
||||
|
||||
const {
|
||||
symbols: { plus100: plus100, noop },
|
||||
close,
|
||||
} = Deno.dlopen("./plus100.dylib", {
|
||||
plus100: {
|
||||
parameters: ["i32"],
|
||||
result: "i32",
|
||||
},
|
||||
noop: {
|
||||
parameters: [],
|
||||
result: "void",
|
||||
},
|
||||
});
|
||||
bench("plus100(1) ", () => {
|
||||
plus100(1);
|
||||
});
|
||||
|
||||
bench("noop() ", () => {
|
||||
noop();
|
||||
});
|
||||
|
||||
// collect option collects benchmark returned values into array
|
||||
// prevents gc and can help with jit optimizing out functions
|
||||
await run({ collect: false, percentiles: true });
|
||||
|
||||
if (plus100(1) !== 101) {
|
||||
throw new Error("plus100(1) !== 101");
|
||||
}
|
||||
Binary file not shown.
@@ -1,19 +0,0 @@
|
||||
import { bench, run } from "mitata";
|
||||
|
||||
const { plus100, noop } =
|
||||
"Bun" in globalThis
|
||||
? require("./plus100-napi")
|
||||
: (await import("module")).createRequire(import.meta.url)("./plus100-napi");
|
||||
|
||||
bench("plus100(1) napi", () => {
|
||||
plus100(1);
|
||||
});
|
||||
bench("noop() napi", () => {
|
||||
noop();
|
||||
});
|
||||
await run({ collect: false, percentiles: true });
|
||||
console.log("\n");
|
||||
|
||||
if (plus100(1) !== 101) {
|
||||
throw new Error("plus100(1) !== 101");
|
||||
}
|
||||
202
bench/ffi/src/Cargo.lock
generated
Normal file
202
bench/ffi/src/Cargo.lock
generated
Normal file
@@ -0,0 +1,202 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "aho-corasick"
|
||||
version = "0.7.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||
|
||||
[[package]]
|
||||
name = "convert_case"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fb4a24b1aaf0fd0ce8b45161144d6f42cd91677fd5940fd431183eb023b3a2b8"
|
||||
|
||||
[[package]]
|
||||
name = "ctor"
|
||||
version = "0.1.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c"
|
||||
dependencies = [
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ffi_napi_bench"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"napi",
|
||||
"napi-build",
|
||||
"napi-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libloading"
|
||||
version = "0.7.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
|
||||
|
||||
[[package]]
|
||||
name = "napi"
|
||||
version = "2.6.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3517d4a4af99e0a9960e26332ee1e1bcb9e0298657f58e7e97157a8532dfcd4b"
|
||||
dependencies = [
|
||||
"ctor",
|
||||
"napi-sys",
|
||||
"once_cell",
|
||||
"thread_local",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "napi-build"
|
||||
version = "2.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "882a73d9ef23e8dc2ebbffb6a6ae2ef467c0f18ac10711e4cc59c5485d41df0e"
|
||||
|
||||
[[package]]
|
||||
name = "napi-derive"
|
||||
version = "2.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3aaa8a11b0ae982306d311627cafd997ef556abdf1d79a01e6e75bc1ac5cfced"
|
||||
dependencies = [
|
||||
"convert_case",
|
||||
"napi-derive-backend",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "napi-derive-backend"
|
||||
version = "1.0.34"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0cdb9be87524eccc14f988825b26eaa3752e07a81cb04c34436057823d91e421"
|
||||
dependencies = [
|
||||
"convert_case",
|
||||
"once_cell",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"regex",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "napi-sys"
|
||||
version = "2.2.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "529671ebfae679f2ce9630b62dd53c72c56b3eb8b2c852e7e2fa91704ff93d67"
|
||||
dependencies = [
|
||||
"libloading",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.40"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.20"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3bcdf212e9776fbcb2d23ab029360416bb1706b1aea2d1a5ba002727cbcab804"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
"regex-syntax",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex-syntax"
|
||||
version = "0.6.27"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.98"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thread_local"
|
||||
version = "1.1.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180"
|
||||
dependencies = [
|
||||
"once_cell",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c"
|
||||
|
||||
[[package]]
|
||||
name = "winapi"
|
||||
version = "0.3.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
|
||||
dependencies = [
|
||||
"winapi-i686-pc-windows-gnu",
|
||||
"winapi-x86_64-pc-windows-gnu",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winapi-i686-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||
|
||||
[[package]]
|
||||
name = "winapi-x86_64-pc-windows-gnu"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||
18
bench/ffi/src/Cargo.toml
Normal file
18
bench/ffi/src/Cargo.toml
Normal file
@@ -0,0 +1,18 @@
|
||||
[package]
|
||||
edition = "2021"
|
||||
version = "0.1.0"
|
||||
name = "ffi_napi_bench"
|
||||
|
||||
[lib]
|
||||
crate-type = ["cdylib"]
|
||||
|
||||
[features]
|
||||
napi = []
|
||||
default = []
|
||||
|
||||
[dependencies]
|
||||
napi = "2"
|
||||
napi-derive = "2"
|
||||
|
||||
[build-dependencies]
|
||||
napi-build = "2.0.1"
|
||||
5
bench/ffi/src/build.rs
Normal file
5
bench/ffi/src/build.rs
Normal file
@@ -0,0 +1,5 @@
|
||||
#[cfg(feature="napi")] extern crate napi_build;
|
||||
|
||||
fn main() {
|
||||
#[cfg(feature="napi")] napi_build::setup();
|
||||
}
|
||||
BIN
bench/ffi/src/bun.lockb
Executable file
BIN
bench/ffi/src/bun.lockb
Executable file
Binary file not shown.
17
bench/ffi/src/package.json
Normal file
17
bench/ffi/src/package.json
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"name": "bench",
|
||||
"napi": {
|
||||
"name": "napi"
|
||||
},
|
||||
"dependencies": {
|
||||
"@napi-rs/cli": "^2.10.1",
|
||||
"@node-rs/helper": "^1.3.3"
|
||||
},
|
||||
"scripts": {
|
||||
"deps": "bun install",
|
||||
"build:ffi": "cargo build --release",
|
||||
"build": "bun run build:napi && bun run build:ffi",
|
||||
"cleanup": "rm -f index.js index.d.ts && mv napi.*.node ffi_napi_bench.node",
|
||||
"build:napi": "napi build --release --platform --no-dts-header --features napi && bun run cleanup"
|
||||
}
|
||||
}
|
||||
49
bench/ffi/src/src/lib.rs
Normal file
49
bench/ffi/src/src/lib.rs
Normal file
@@ -0,0 +1,49 @@
|
||||
// double src o.O
|
||||
|
||||
#[cfg(feature="napi")] use napi_derive::napi;
|
||||
#[cfg(feature="napi")] use napi::bindgen_prelude::*;
|
||||
|
||||
static STRING: &'static str = "Hello, world!\0";
|
||||
|
||||
fn hash(buf: &[u8]) -> u32 {
|
||||
let mut hash: u32 = 0;
|
||||
|
||||
for byte in buf {
|
||||
hash = hash.wrapping_mul(0x10001000).wrapping_add(*byte as u32);
|
||||
}
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#[cfg(feature="napi")]
|
||||
#[napi] pub fn napi_noop() {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
#[no_mangle] unsafe extern "C" fn ffi_noop() {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
|
||||
|
||||
#[cfg(feature="napi")]
|
||||
#[napi] pub fn napi_string() -> &'static str {
|
||||
return &STRING[0..(STRING.len() - 1)];
|
||||
}
|
||||
|
||||
#[no_mangle] unsafe extern "C" fn ffi_string() -> *const u8 {
|
||||
return STRING.as_ptr();
|
||||
}
|
||||
|
||||
|
||||
|
||||
#[cfg(feature="napi")]
|
||||
#[napi] pub fn napi_hash(buffer: Buffer) -> u32 {
|
||||
return hash(&buffer);
|
||||
}
|
||||
|
||||
#[no_mangle] unsafe extern "C" fn ffi_hash(ptr: *const u8, length: u32) -> u32 {
|
||||
return hash(std::slice::from_raw_parts(ptr, length as usize));
|
||||
}
|
||||
3
bench/gzip/.env
Normal file
3
bench/gzip/.env
Normal file
@@ -0,0 +1,3 @@
|
||||
BUN=bun
|
||||
DENO=deno
|
||||
NODE=node
|
||||
@@ -1,4 +1,4 @@
|
||||
import { bench, group, run } from "mitata";
|
||||
import { run, bench } from "mitata";
|
||||
import { gzipSync, gunzipSync } from "bun";
|
||||
|
||||
const data = new TextEncoder().encode("Hello World!".repeat(9999));
|
||||
@@ -17,4 +17,4 @@ bench(`gunzipSync("Hello World!".repeat(9999)))`, () => {
|
||||
gunzipSync(compressed);
|
||||
});
|
||||
|
||||
run({ collect: false, percentiles: true });
|
||||
await run();
|
||||
85
bench/gzip/deno.js
Normal file
85
bench/gzip/deno.js
Normal file
@@ -0,0 +1,85 @@
|
||||
import { run, bench } from "../node_modules/mitata/src/cli.mjs";
|
||||
|
||||
const data = new TextEncoder().encode("Hello World!".repeat(9999));
|
||||
|
||||
const compressed = await compress(data);
|
||||
|
||||
bench(`roundtrip - "Hello World!".repeat(9999))`, async () => {
|
||||
await decompress(await compress(data));
|
||||
});
|
||||
|
||||
bench(`gzip("Hello World!".repeat(9999)))`, async () => {
|
||||
await compress(data);
|
||||
});
|
||||
|
||||
bench(`gunzip("Hello World!".repeat(9999)))`, async () => {
|
||||
await decompress(compressed);
|
||||
});
|
||||
|
||||
await run();
|
||||
|
||||
async function compress(buffer) {
|
||||
const cs = new CompressionStream("gzip");
|
||||
|
||||
const writer = cs.writable.getWriter();
|
||||
|
||||
writer.write(buffer);
|
||||
|
||||
writer.close();
|
||||
const chunks = [];
|
||||
const reader = cs.readable.getReader();
|
||||
|
||||
let length = 0;
|
||||
|
||||
while (true) {
|
||||
const { done, value } = await reader.read();
|
||||
|
||||
if (done) break;
|
||||
chunks.push(value);
|
||||
length += value.length;
|
||||
}
|
||||
|
||||
const u8 = new Uint8Array(length);
|
||||
|
||||
let offset = 0;
|
||||
|
||||
for (const chunk of chunks) {
|
||||
u8.set(chunk, offset);
|
||||
offset += chunk.length;
|
||||
}
|
||||
|
||||
return u8;
|
||||
}
|
||||
|
||||
async function decompress(buffer) {
|
||||
const ds = new DecompressionStream("gzip");
|
||||
|
||||
const writer = ds.writable.getWriter();
|
||||
|
||||
writer.write(buffer);
|
||||
|
||||
writer.close();
|
||||
const chunks = [];
|
||||
const reader = ds.readable.getReader();
|
||||
|
||||
let length = 0;
|
||||
|
||||
while (true) {
|
||||
const { done, value } = await reader.read();
|
||||
|
||||
if (done) break;
|
||||
chunks.push(value);
|
||||
length += value.length;
|
||||
}
|
||||
|
||||
const u8 = new Uint8Array(length);
|
||||
|
||||
let offset = 0;
|
||||
|
||||
for (const chunk of chunks) {
|
||||
u8.set(chunk, offset);
|
||||
offset += chunk.length;
|
||||
}
|
||||
|
||||
return u8;
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
import { bench, group, run } from "mitata";
|
||||
import { run, bench } from "mitata";
|
||||
import { gzipSync, gunzipSync } from "zlib";
|
||||
|
||||
const data = new TextEncoder().encode("Hello World!".repeat(9999));
|
||||
@@ -17,4 +17,4 @@ bench(`gunzipSync("Hello World!".repeat(9999)))`, () => {
|
||||
gunzipSync(compressed);
|
||||
});
|
||||
|
||||
run({ collect: false, percentiles: true });
|
||||
await run();
|
||||
11
bench/gzip/package.json
Normal file
11
bench/gzip/package.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"name": "bench",
|
||||
"scripts": {
|
||||
"deps": "exit 0",
|
||||
"build": "exit 0",
|
||||
"bench:bun": "$BUN bun.js",
|
||||
"bench:node": "$NODE node.mjs",
|
||||
"bench:deno": "$DENO run -A --unstable deno.js",
|
||||
"bench": "bun run bench:bun && bun run bench:node && bun run bench:deno"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
import { Global } from "@emotion/react";
|
||||
export function CSSInJSStyles() {
|
||||
return (
|
||||
|
||||
1986
bench/package-lock.json
generated
Normal file
1986
bench/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,12 +1,16 @@
|
||||
{
|
||||
"name": "snippets",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"license": "MIT",
|
||||
"name": "bench",
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.16.10",
|
||||
"@babel/preset-react": "^7.16.7",
|
||||
"mitata": "^0.1.6",
|
||||
"esbuild": "^0.14.12",
|
||||
"@swc/core": "^1.2.133",
|
||||
"esbuild": "^0.14.12"
|
||||
"@babel/core": "^7.16.10",
|
||||
"@babel/preset-react": "^7.16.7"
|
||||
},
|
||||
"scripts": {
|
||||
"ffi": "cd ffi && bun run deps && bun run build && bun run bench",
|
||||
"gzip": "cd gzip && bun run deps && bun run build && bun run bench",
|
||||
"async": "cd async && bun run deps && bun run build && bun run bench",
|
||||
"sqlite": "cd sqlite && bun run deps && bun run build && bun run bench"
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -13,7 +13,7 @@ const App = () => (
|
||||
const headers = {
|
||||
headers: {
|
||||
"Content-Type": "text/html",
|
||||
"Cache-Control": "no-transform" // disables response body auto compression, see https://deno.land/manual/runtime/http_server_apis#automatic-body-compression
|
||||
"Cache-Control": "no-transform", // disables response body auto compression, see https://deno.land/manual/runtime/http_server_apis#automatic-body-compression
|
||||
},
|
||||
};
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
// import { renderToReadableStream } from "react-dom/server.browser";
|
||||
var { renderToReadableStream } = import.meta.require(
|
||||
"../test/bun.js/reactdom-bun.js"
|
||||
"../../test/bun.js/reactdom-bun.js"
|
||||
);
|
||||
|
||||
const headers = {
|
||||
headers: {
|
||||
"Content-Type": "text/html",
|
||||
"Cache-Control": "no-transform" // set to match the Deno benchmark, which requires this for an apples to apples comparison
|
||||
"Cache-Control": "no-transform", // set to match the Deno benchmark, which requires this for an apples to apples comparison
|
||||
},
|
||||
};
|
||||
|
||||
15935
bench/react-hello-world/react-hello-world.node.js
Normal file
15935
bench/react-hello-world/react-hello-world.node.js
Normal file
File diff suppressed because it is too large
Load Diff
3
bench/sqlite/.env
Normal file
3
bench/sqlite/.env
Normal file
@@ -0,0 +1,3 @@
|
||||
BUN=bun
|
||||
DENO=deno
|
||||
NODE=node
|
||||
@@ -1,6 +1,7 @@
|
||||
import { bench, run } from "mitata";
|
||||
import { run, bench } from "mitata";
|
||||
import { Database } from "bun:sqlite";
|
||||
const db = Database.open("/tmp/northwind.sqlite");
|
||||
|
||||
const db = Database.open("./src/northwind.sqlite");
|
||||
|
||||
{
|
||||
const sql = db.prepare(`SELECT * FROM "Order"`);
|
||||
@@ -23,4 +24,4 @@ const db = Database.open("/tmp/northwind.sqlite");
|
||||
});
|
||||
}
|
||||
|
||||
run({ json: false });
|
||||
await run();
|
||||
@@ -1,6 +1,7 @@
|
||||
import { DB } from "https://deno.land/x/sqlite/mod.ts";
|
||||
import { bench, run } from "https://esm.run/mitata";
|
||||
const db = new DB("/tmp/northwind.sqlite");
|
||||
import { run, bench } from "../node_modules/mitata/src/cli.mjs";
|
||||
|
||||
const db = new DB("./src/northwind.sqlite");
|
||||
|
||||
{
|
||||
const sql = db.prepareQuery(`SELECT * FROM "Order"`);
|
||||
@@ -23,4 +24,4 @@ const db = new DB("/tmp/northwind.sqlite");
|
||||
});
|
||||
}
|
||||
|
||||
run({ json: false });
|
||||
await run();
|
||||
@@ -1,10 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
rm -rf Northwind_large.sqlite.zip
|
||||
curl -LJO https://github.com/jpwhite3/northwind-SQLite3/blob/master/Northwind_large.sqlite.zip?raw=true
|
||||
unzip Northwind_large.sqlite.zip?raw=true
|
||||
rm Northwind_large.sqlite.zip?raw=true
|
||||
mv Northwind_large.sqlite /tmp/northwind.sqlite
|
||||
rm -rf Northwind* || echo ""
|
||||
rm -rf __MACOSX
|
||||
@@ -1,8 +1,8 @@
|
||||
import { bench, run } from "mitata";
|
||||
import { run, bench } from "mitata";
|
||||
import { createRequire } from "module";
|
||||
const db = createRequire(import.meta.url)("better-sqlite3")(
|
||||
"/tmp/northwind.sqlite"
|
||||
);
|
||||
|
||||
const require = createRequire(import.meta.url);
|
||||
const db = require("better-sqlite3")("./src/northwind.sqlite");
|
||||
|
||||
{
|
||||
const sql = db.prepare(`SELECT * FROM "Order"`);
|
||||
@@ -28,4 +28,4 @@ const db = createRequire(import.meta.url)("better-sqlite3")(
|
||||
});
|
||||
}
|
||||
|
||||
run({ json: false });
|
||||
await run();
|
||||
495
bench/sqlite/package-lock.json
generated
495
bench/sqlite/package-lock.json
generated
@@ -6,30 +6,7 @@
|
||||
"": {
|
||||
"name": "bench",
|
||||
"dependencies": {
|
||||
"better-sqlite3": "^7.5.1",
|
||||
"mitata": "^0.0.14"
|
||||
}
|
||||
},
|
||||
"node_modules/ansi-regex": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
|
||||
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/aproba": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
|
||||
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
|
||||
},
|
||||
"node_modules/are-we-there-yet": {
|
||||
"version": "1.1.7",
|
||||
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
|
||||
"integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
|
||||
"dependencies": {
|
||||
"delegates": "^1.0.0",
|
||||
"readable-stream": "^2.0.6"
|
||||
"better-sqlite3": "^7.6.0"
|
||||
}
|
||||
},
|
||||
"node_modules/base64-js": {
|
||||
@@ -52,13 +29,13 @@
|
||||
]
|
||||
},
|
||||
"node_modules/better-sqlite3": {
|
||||
"version": "7.5.1",
|
||||
"resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.5.1.tgz",
|
||||
"integrity": "sha512-+i6tH1y9KEIol1iYpZJrqDwBDQZGHioDENU49Rnidorp3bSXvw/QTYDjQGq9+TFF7RX4q0YV1sEOIRq4vDZdRg==",
|
||||
"version": "7.6.0",
|
||||
"resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.6.0.tgz",
|
||||
"integrity": "sha512-wYckL8S8RHP+KKNsZuJGZ7z/6FFmVgwd0U8jSv6t997C+EFR1yvi8p2WIpTb10jiV5rRA5VtMdgtAZFcAnK3Iw==",
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
"bindings": "^1.5.0",
|
||||
"prebuild-install": "^7.0.0"
|
||||
"prebuild-install": "^7.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/bindings": {
|
||||
@@ -79,19 +56,6 @@
|
||||
"readable-stream": "^3.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/bl/node_modules/readable-stream": {
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
|
||||
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
|
||||
"dependencies": {
|
||||
"inherits": "^2.0.3",
|
||||
"string_decoder": "^1.1.1",
|
||||
"util-deprecate": "^1.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 6"
|
||||
}
|
||||
},
|
||||
"node_modules/buffer": {
|
||||
"version": "5.7.1",
|
||||
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
|
||||
@@ -120,24 +84,6 @@
|
||||
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
|
||||
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
|
||||
},
|
||||
"node_modules/code-point-at": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
|
||||
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/console-control-strings": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
|
||||
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
|
||||
},
|
||||
"node_modules/core-util-is": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
|
||||
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
|
||||
},
|
||||
"node_modules/decompress-response": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
|
||||
@@ -160,11 +106,6 @@
|
||||
"node": ">=4.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/delegates": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
|
||||
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
|
||||
},
|
||||
"node_modules/detect-libc": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
|
||||
@@ -199,30 +140,10 @@
|
||||
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
|
||||
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
|
||||
},
|
||||
"node_modules/gauge": {
|
||||
"version": "2.7.4",
|
||||
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
|
||||
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
|
||||
"dependencies": {
|
||||
"aproba": "^1.0.3",
|
||||
"console-control-strings": "^1.0.0",
|
||||
"has-unicode": "^2.0.0",
|
||||
"object-assign": "^4.1.0",
|
||||
"signal-exit": "^3.0.0",
|
||||
"string-width": "^1.0.1",
|
||||
"strip-ansi": "^3.0.1",
|
||||
"wide-align": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/github-from-package": {
|
||||
"version": "0.0.0",
|
||||
"resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
|
||||
"integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4="
|
||||
},
|
||||
"node_modules/has-unicode": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
|
||||
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
|
||||
"integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="
|
||||
},
|
||||
"node_modules/ieee754": {
|
||||
"version": "1.2.1",
|
||||
@@ -253,22 +174,6 @@
|
||||
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
|
||||
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
|
||||
},
|
||||
"node_modules/is-fullwidth-code-point": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
|
||||
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
|
||||
"dependencies": {
|
||||
"number-is-nan": "^1.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/isarray": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
||||
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
|
||||
},
|
||||
"node_modules/lru-cache": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
|
||||
@@ -296,11 +201,6 @@
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
|
||||
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
|
||||
},
|
||||
"node_modules/mitata": {
|
||||
"version": "0.0.14",
|
||||
"resolved": "https://registry.npmjs.org/mitata/-/mitata-0.0.14.tgz",
|
||||
"integrity": "sha512-wQW/j1UNnkpw8AvWvrkKhrQBroz0mRhGFXYXZ+yDstBVt+/lN30wI1Qk49PqkFgU99n4g0tYsxXxhogONJjUwA=="
|
||||
},
|
||||
"node_modules/mkdirp-classic": {
|
||||
"version": "0.5.3",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
|
||||
@@ -312,9 +212,9 @@
|
||||
"integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="
|
||||
},
|
||||
"node_modules/node-abi": {
|
||||
"version": "3.15.0",
|
||||
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.15.0.tgz",
|
||||
"integrity": "sha512-Ic6z/j6I9RLm4ov7npo1I48UQr2BEyFCqh6p7S1dhEx9jPO0GPGq/e2Rb7x7DroQrmiVMz/Bw1vJm9sPAl2nxA==",
|
||||
"version": "3.22.0",
|
||||
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.22.0.tgz",
|
||||
"integrity": "sha512-u4uAs/4Zzmp/jjsD9cyFYDXeISfUWaAVWshPmDZOFOv4Xl4SbzTXm53I04C2uRueYJ+0t5PEtLH/owbn2Npf/w==",
|
||||
"dependencies": {
|
||||
"semver": "^7.3.5"
|
||||
},
|
||||
@@ -322,45 +222,18 @@
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/npmlog": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
|
||||
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
|
||||
"dependencies": {
|
||||
"are-we-there-yet": "~1.1.2",
|
||||
"console-control-strings": "~1.1.0",
|
||||
"gauge": "~2.7.3",
|
||||
"set-blocking": "~2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/number-is-nan": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
|
||||
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/object-assign": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
|
||||
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/once": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
|
||||
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
|
||||
"dependencies": {
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"node_modules/prebuild-install": {
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.0.tgz",
|
||||
"integrity": "sha512-CNcMgI1xBypOyGqjp3wOc8AAo1nMhZS3Cwd3iHIxOdAUbb+YxdNuM4Z5iIrZ8RLvOsf3F3bl7b7xGq6DjQoNYA==",
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz",
|
||||
"integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==",
|
||||
"dependencies": {
|
||||
"detect-libc": "^2.0.0",
|
||||
"expand-template": "^2.0.3",
|
||||
@@ -369,7 +242,6 @@
|
||||
"mkdirp-classic": "^0.5.3",
|
||||
"napi-build-utils": "^1.0.1",
|
||||
"node-abi": "^3.3.0",
|
||||
"npmlog": "^4.0.1",
|
||||
"pump": "^3.0.0",
|
||||
"rc": "^1.2.7",
|
||||
"simple-get": "^4.0.0",
|
||||
@@ -383,11 +255,6 @@
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/process-nextick-args": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
||||
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
|
||||
},
|
||||
"node_modules/pump": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
|
||||
@@ -412,23 +279,36 @@
|
||||
}
|
||||
},
|
||||
"node_modules/readable-stream": {
|
||||
"version": "2.3.7",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
|
||||
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
|
||||
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
|
||||
"dependencies": {
|
||||
"core-util-is": "~1.0.0",
|
||||
"inherits": "~2.0.3",
|
||||
"isarray": "~1.0.0",
|
||||
"process-nextick-args": "~2.0.0",
|
||||
"safe-buffer": "~5.1.1",
|
||||
"string_decoder": "~1.1.1",
|
||||
"util-deprecate": "~1.0.1"
|
||||
"inherits": "^2.0.3",
|
||||
"string_decoder": "^1.1.1",
|
||||
"util-deprecate": "^1.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 6"
|
||||
}
|
||||
},
|
||||
"node_modules/safe-buffer": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
|
||||
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/feross"
|
||||
},
|
||||
{
|
||||
"type": "patreon",
|
||||
"url": "https://www.patreon.com/feross"
|
||||
},
|
||||
{
|
||||
"type": "consulting",
|
||||
"url": "https://feross.org/support"
|
||||
}
|
||||
]
|
||||
},
|
||||
"node_modules/semver": {
|
||||
"version": "7.3.7",
|
||||
@@ -444,16 +324,6 @@
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/set-blocking": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
|
||||
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
|
||||
},
|
||||
"node_modules/signal-exit": {
|
||||
"version": "3.0.7",
|
||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
|
||||
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
|
||||
},
|
||||
"node_modules/simple-concat": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
|
||||
@@ -498,41 +368,17 @@
|
||||
}
|
||||
},
|
||||
"node_modules/string_decoder": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
|
||||
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
|
||||
"dependencies": {
|
||||
"safe-buffer": "~5.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/string-width": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
|
||||
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
|
||||
"dependencies": {
|
||||
"code-point-at": "^1.0.0",
|
||||
"is-fullwidth-code-point": "^1.0.0",
|
||||
"strip-ansi": "^3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/strip-ansi": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
|
||||
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
|
||||
"dependencies": {
|
||||
"ansi-regex": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
"safe-buffer": "~5.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/strip-json-comments": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
|
||||
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
|
||||
"integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
@@ -563,23 +409,10 @@
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/tar-stream/node_modules/readable-stream": {
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
|
||||
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
|
||||
"dependencies": {
|
||||
"inherits": "^2.0.3",
|
||||
"string_decoder": "^1.1.1",
|
||||
"util-deprecate": "^1.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 6"
|
||||
}
|
||||
},
|
||||
"node_modules/tunnel-agent": {
|
||||
"version": "0.6.0",
|
||||
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
|
||||
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
|
||||
"integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
|
||||
"dependencies": {
|
||||
"safe-buffer": "^5.0.1"
|
||||
},
|
||||
@@ -590,20 +423,12 @@
|
||||
"node_modules/util-deprecate": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
|
||||
},
|
||||
"node_modules/wide-align": {
|
||||
"version": "1.1.5",
|
||||
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
|
||||
"integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
|
||||
"dependencies": {
|
||||
"string-width": "^1.0.2 || 2 || 3 || 4"
|
||||
}
|
||||
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
|
||||
},
|
||||
"node_modules/wrappy": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
|
||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
|
||||
},
|
||||
"node_modules/yallist": {
|
||||
"version": "4.0.0",
|
||||
@@ -612,37 +437,18 @@
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"ansi-regex": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
|
||||
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
|
||||
},
|
||||
"aproba": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
|
||||
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
|
||||
},
|
||||
"are-we-there-yet": {
|
||||
"version": "1.1.7",
|
||||
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
|
||||
"integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
|
||||
"requires": {
|
||||
"delegates": "^1.0.0",
|
||||
"readable-stream": "^2.0.6"
|
||||
}
|
||||
},
|
||||
"base64-js": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
|
||||
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
|
||||
},
|
||||
"better-sqlite3": {
|
||||
"version": "7.5.1",
|
||||
"resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.5.1.tgz",
|
||||
"integrity": "sha512-+i6tH1y9KEIol1iYpZJrqDwBDQZGHioDENU49Rnidorp3bSXvw/QTYDjQGq9+TFF7RX4q0YV1sEOIRq4vDZdRg==",
|
||||
"version": "7.6.0",
|
||||
"resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.6.0.tgz",
|
||||
"integrity": "sha512-wYckL8S8RHP+KKNsZuJGZ7z/6FFmVgwd0U8jSv6t997C+EFR1yvi8p2WIpTb10jiV5rRA5VtMdgtAZFcAnK3Iw==",
|
||||
"requires": {
|
||||
"bindings": "^1.5.0",
|
||||
"prebuild-install": "^7.0.0"
|
||||
"prebuild-install": "^7.1.0"
|
||||
}
|
||||
},
|
||||
"bindings": {
|
||||
@@ -661,18 +467,6 @@
|
||||
"buffer": "^5.5.0",
|
||||
"inherits": "^2.0.4",
|
||||
"readable-stream": "^3.4.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"readable-stream": {
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
|
||||
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
|
||||
"requires": {
|
||||
"inherits": "^2.0.3",
|
||||
"string_decoder": "^1.1.1",
|
||||
"util-deprecate": "^1.0.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"buffer": {
|
||||
@@ -689,21 +483,6 @@
|
||||
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
|
||||
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
|
||||
},
|
||||
"code-point-at": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
|
||||
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
|
||||
},
|
||||
"console-control-strings": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
|
||||
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
|
||||
},
|
||||
"core-util-is": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
|
||||
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
|
||||
},
|
||||
"decompress-response": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
|
||||
@@ -717,11 +496,6 @@
|
||||
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
|
||||
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
|
||||
},
|
||||
"delegates": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
|
||||
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
|
||||
},
|
||||
"detect-libc": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
|
||||
@@ -750,30 +524,10 @@
|
||||
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
|
||||
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
|
||||
},
|
||||
"gauge": {
|
||||
"version": "2.7.4",
|
||||
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
|
||||
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
|
||||
"requires": {
|
||||
"aproba": "^1.0.3",
|
||||
"console-control-strings": "^1.0.0",
|
||||
"has-unicode": "^2.0.0",
|
||||
"object-assign": "^4.1.0",
|
||||
"signal-exit": "^3.0.0",
|
||||
"string-width": "^1.0.1",
|
||||
"strip-ansi": "^3.0.1",
|
||||
"wide-align": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"github-from-package": {
|
||||
"version": "0.0.0",
|
||||
"resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
|
||||
"integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4="
|
||||
},
|
||||
"has-unicode": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
|
||||
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
|
||||
"integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="
|
||||
},
|
||||
"ieee754": {
|
||||
"version": "1.2.1",
|
||||
@@ -790,19 +544,6 @@
|
||||
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
|
||||
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
|
||||
},
|
||||
"is-fullwidth-code-point": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
|
||||
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
|
||||
"requires": {
|
||||
"number-is-nan": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"isarray": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
||||
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
|
||||
},
|
||||
"lru-cache": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
|
||||
@@ -821,11 +562,6 @@
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
|
||||
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
|
||||
},
|
||||
"mitata": {
|
||||
"version": "0.0.14",
|
||||
"resolved": "https://registry.npmjs.org/mitata/-/mitata-0.0.14.tgz",
|
||||
"integrity": "sha512-wQW/j1UNnkpw8AvWvrkKhrQBroz0mRhGFXYXZ+yDstBVt+/lN30wI1Qk49PqkFgU99n4g0tYsxXxhogONJjUwA=="
|
||||
},
|
||||
"mkdirp-classic": {
|
||||
"version": "0.5.3",
|
||||
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
|
||||
@@ -837,46 +573,25 @@
|
||||
"integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="
|
||||
},
|
||||
"node-abi": {
|
||||
"version": "3.15.0",
|
||||
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.15.0.tgz",
|
||||
"integrity": "sha512-Ic6z/j6I9RLm4ov7npo1I48UQr2BEyFCqh6p7S1dhEx9jPO0GPGq/e2Rb7x7DroQrmiVMz/Bw1vJm9sPAl2nxA==",
|
||||
"version": "3.22.0",
|
||||
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.22.0.tgz",
|
||||
"integrity": "sha512-u4uAs/4Zzmp/jjsD9cyFYDXeISfUWaAVWshPmDZOFOv4Xl4SbzTXm53I04C2uRueYJ+0t5PEtLH/owbn2Npf/w==",
|
||||
"requires": {
|
||||
"semver": "^7.3.5"
|
||||
}
|
||||
},
|
||||
"npmlog": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
|
||||
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
|
||||
"requires": {
|
||||
"are-we-there-yet": "~1.1.2",
|
||||
"console-control-strings": "~1.1.0",
|
||||
"gauge": "~2.7.3",
|
||||
"set-blocking": "~2.0.0"
|
||||
}
|
||||
},
|
||||
"number-is-nan": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
|
||||
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
|
||||
},
|
||||
"object-assign": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
|
||||
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
|
||||
},
|
||||
"once": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
|
||||
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
|
||||
"requires": {
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"prebuild-install": {
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.0.tgz",
|
||||
"integrity": "sha512-CNcMgI1xBypOyGqjp3wOc8AAo1nMhZS3Cwd3iHIxOdAUbb+YxdNuM4Z5iIrZ8RLvOsf3F3bl7b7xGq6DjQoNYA==",
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz",
|
||||
"integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==",
|
||||
"requires": {
|
||||
"detect-libc": "^2.0.0",
|
||||
"expand-template": "^2.0.3",
|
||||
@@ -885,7 +600,6 @@
|
||||
"mkdirp-classic": "^0.5.3",
|
||||
"napi-build-utils": "^1.0.1",
|
||||
"node-abi": "^3.3.0",
|
||||
"npmlog": "^4.0.1",
|
||||
"pump": "^3.0.0",
|
||||
"rc": "^1.2.7",
|
||||
"simple-get": "^4.0.0",
|
||||
@@ -893,11 +607,6 @@
|
||||
"tunnel-agent": "^0.6.0"
|
||||
}
|
||||
},
|
||||
"process-nextick-args": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
|
||||
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
|
||||
},
|
||||
"pump": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
|
||||
@@ -919,23 +628,19 @@
|
||||
}
|
||||
},
|
||||
"readable-stream": {
|
||||
"version": "2.3.7",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
|
||||
"integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
|
||||
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
|
||||
"requires": {
|
||||
"core-util-is": "~1.0.0",
|
||||
"inherits": "~2.0.3",
|
||||
"isarray": "~1.0.0",
|
||||
"process-nextick-args": "~2.0.0",
|
||||
"safe-buffer": "~5.1.1",
|
||||
"string_decoder": "~1.1.1",
|
||||
"util-deprecate": "~1.0.1"
|
||||
"inherits": "^2.0.3",
|
||||
"string_decoder": "^1.1.1",
|
||||
"util-deprecate": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"safe-buffer": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
|
||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
|
||||
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
|
||||
},
|
||||
"semver": {
|
||||
"version": "7.3.7",
|
||||
@@ -945,16 +650,6 @@
|
||||
"lru-cache": "^6.0.0"
|
||||
}
|
||||
},
|
||||
"set-blocking": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
|
||||
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
|
||||
},
|
||||
"signal-exit": {
|
||||
"version": "3.0.7",
|
||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
|
||||
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
|
||||
},
|
||||
"simple-concat": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
|
||||
@@ -971,35 +666,17 @@
|
||||
}
|
||||
},
|
||||
"string_decoder": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
|
||||
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
|
||||
"requires": {
|
||||
"safe-buffer": "~5.1.0"
|
||||
}
|
||||
},
|
||||
"string-width": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
|
||||
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
|
||||
"requires": {
|
||||
"code-point-at": "^1.0.0",
|
||||
"is-fullwidth-code-point": "^1.0.0",
|
||||
"strip-ansi": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"strip-ansi": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
|
||||
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
|
||||
"requires": {
|
||||
"ansi-regex": "^2.0.0"
|
||||
"safe-buffer": "~5.2.0"
|
||||
}
|
||||
},
|
||||
"strip-json-comments": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
|
||||
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
|
||||
"integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="
|
||||
},
|
||||
"tar-fs": {
|
||||
"version": "2.1.1",
|
||||
@@ -1022,24 +699,12 @@
|
||||
"fs-constants": "^1.0.0",
|
||||
"inherits": "^2.0.3",
|
||||
"readable-stream": "^3.1.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"readable-stream": {
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
|
||||
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
|
||||
"requires": {
|
||||
"inherits": "^2.0.3",
|
||||
"string_decoder": "^1.1.1",
|
||||
"util-deprecate": "^1.0.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"tunnel-agent": {
|
||||
"version": "0.6.0",
|
||||
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
|
||||
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
|
||||
"integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
|
||||
"requires": {
|
||||
"safe-buffer": "^5.0.1"
|
||||
}
|
||||
@@ -1047,20 +712,12 @@
|
||||
"util-deprecate": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
|
||||
},
|
||||
"wide-align": {
|
||||
"version": "1.1.5",
|
||||
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
|
||||
"integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
|
||||
"requires": {
|
||||
"string-width": "^1.0.2 || 2 || 3 || 4"
|
||||
}
|
||||
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
|
||||
},
|
||||
"wrappy": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
|
||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
|
||||
},
|
||||
"yallist": {
|
||||
"version": "4.0.0",
|
||||
|
||||
@@ -1,7 +1,14 @@
|
||||
{
|
||||
"name": "bench",
|
||||
"dependencies": {
|
||||
"better-sqlite3": "^7.5.1",
|
||||
"mitata": "^0.0.14"
|
||||
"better-sqlite3": "^7.6.0"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "exit 0",
|
||||
"bench:bun": "$BUN bun.js",
|
||||
"bench:node": "$NODE node.mjs",
|
||||
"deps": "npm install && sh src/download.sh",
|
||||
"bench:deno": "$DENO run -A --unstable deno.js",
|
||||
"bench": "bun run bench:bun && bun run bench:node && bun run bench:deno"
|
||||
}
|
||||
}
|
||||
|
||||
16
bench/sqlite/src/download.sh
Normal file
16
bench/sqlite/src/download.sh
Normal file
@@ -0,0 +1,16 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
if [ -f src/northwind.sqlite ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
curl -LJO https://raw.githubusercontent.com/jpwhite3/northwind-SQLite3/master/Northwind_large.sqlite.zip
|
||||
|
||||
unzip Northwind_large.sqlite.zip
|
||||
|
||||
rm Northwind_large.sqlite.zip
|
||||
mv Northwind_large.sqlite src/northwind.sqlite
|
||||
|
||||
rm -rf __MACOSX
|
||||
rm -rf Northwind* || echo ""
|
||||
Reference in New Issue
Block a user