如何正确地将读取流分叉为3个压缩流以进行基准测试计算



我想将从一个简单的.txt文件创建的readStream分叉为3个压缩流(gzip、brotli和deflate(,以便计算每个文件压缩所需的时间。我目前的代码看起来像这样:

import {createReadStream, createWriteStream} from 'fs';
import zlib from 'zlib';
const main = () => {
const filename = 'file.txt';
const fileStream = createReadStream(filename);
const compressions = {
createGzip: 'gz',
createBrotliCompress: 'br',
createDeflate: 'deflate'
};
let {length} = Object.keys(compressions);
const timings = {};
for (const [module, ext] of Object.entries(compressions)) {
timings[module] = Date.now();
fileStream
.pipe(zlib[module]())
.pipe(createWriteStream(`${filename}.${ext}`))
.on('finish', () => {
timings[module] = `it took ${Date.now()-timings[module]}ms`;
if (!--length)
console.log(timings);
});
}
};
main();

然而,当我运行脚本时,每次压缩的结果总是大致相同的时间,这意味着"finish"事件必须在fileStream本身关闭时触发,而不是针对每个压缩写入流。我该如何正确地实现这一点?

{
createGzip: 'it took 3161ms',
createBrotliCompress: 'it took 3169ms',
createDeflate: 'it took 3155ms'
}

将单个源限制为多个汇点的速率

当将流管道传输到多个接收器时,执行速度最慢的接收器将限制读取流的块速率。

在OP的场景中,当三个接收器中的任何一个发出写缓冲区已满的信号("背压"(时,读取流将暂停从"file.txt"读取块。因此,最高效的信宿将不得不等待最慢的信宿处理其缓冲区,并且时间将或多或少相同。

通过为每个接收器创建一个单独的读取流,或者按顺序运行性能测试,可以解决此问题。

相关内容

最新更新