Files
bun.sh/test/js/web/streams/streams-leak.test.ts
chloe caruso 78e52006c5 Rewrite internal Web Streams to use less memory (#16860)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
Co-authored-by: pfg <pfg@pfg.pw>
2025-02-15 01:16:28 -08:00

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);
},
);