mirror of
https://github.com/oven-sh/bun
synced 2026-02-09 10:28:47 +00:00
63 lines
1.7 KiB
TypeScript
63 lines
1.7 KiB
TypeScript
import { expect, test } from "bun:test";
|
|
import { isWindows } from "harness";
|
|
|
|
const BYTES_TO_WRITE = 500_000;
|
|
|
|
// https://github.com/oven-sh/bun/issues/12198
|
|
test.skipIf(isWindows)(
|
|
"Absolute memory usage remains relatively constant when reading and writing to a pipe",
|
|
async () => {
|
|
async function write(bytes: number) {
|
|
const buf = Buffer.alloc(bytes, "foo");
|
|
await cat.stdin.write(buf);
|
|
}
|
|
async function read(bytes: number) {
|
|
let i = 0;
|
|
while (true) {
|
|
const { value } = await r.read();
|
|
i += value?.length ?? 0;
|
|
if (i >= bytes) {
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
async function readAndWrite(bytes = BYTES_TO_WRITE) {
|
|
await Promise.all([write(bytes), read(bytes)]);
|
|
}
|
|
|
|
await using cat = Bun.spawn(["cat"], {
|
|
stdin: "pipe",
|
|
stdout: "pipe",
|
|
stderr: "inherit",
|
|
});
|
|
const r = cat.stdout.getReader() as any;
|
|
|
|
const rounds = 5000;
|
|
|
|
for (let i = 0; i < rounds; i++) {
|
|
await readAndWrite(BYTES_TO_WRITE);
|
|
}
|
|
Bun.gc(true);
|
|
const before = process.memoryUsage.rss();
|
|
|
|
for (let i = 0; i < rounds; i++) {
|
|
await readAndWrite();
|
|
}
|
|
Bun.gc(true);
|
|
const after = process.memoryUsage.rss();
|
|
|
|
for (let i = 0; i < rounds; i++) {
|
|
await readAndWrite();
|
|
}
|
|
Bun.gc(true);
|
|
const after2 = process.memoryUsage.rss();
|
|
console.log({ after, after2 });
|
|
console.log(require("bun:jsc").heapStats());
|
|
console.log("RSS delta", ((after - before) | 0) / 1024 / 1024);
|
|
console.log("RSS total", (after / 1024 / 1024) | 0, "MB");
|
|
expect(after).toBeLessThan(250 * 1024 * 1024);
|
|
expect(after).toBeLessThan(before * 1.5);
|
|
},
|
|
);
|