我必须能够从stdin读取大量输入(10 ^ 5空格分隔数字)。任何高于10 ^ 3的输入和readline只需要200秒就可以读取它,我需要能够在不到5秒的时间内完成。我应该使用readline以外的东西还是有办法增加readline的缓冲区?
答案 0 :(得分:2)
使用Transform stream解决这个问题非常容易,但您不必这样做,因为有人已经为您完成了工作。看一下split2模块,它接收一个数据流并将其拆分到给定的分隔符上。你可以这样使用它:
const split2 = require('split2');
process.stdin
.pipe(split2(' '))
.pipe(process.stdout);
在我的机器上(MacBook Pro,英特尔酷睿i7),以上为100,000个以空格分隔的数字为0.41秒,为1,000,000个数字为2.06秒。
当然,这非常无用。假设我们想要对数字求和:
const split2 = require('split2');
let sum = 0;
process.stdin.pipe(split2(' '))
.on('data', data => sum += parseInt(data, 10))
.on('end', () => console.log('Sum: %d', sum));
这在我的机器上的0.28s中的1e5数字和在1.87s中的1e6相加。 (为什么它更快?大概是因为它只写了一行输出,写入STDOUT显然比解析整数和添加更昂贵。)
答案 1 :(得分:0)
根据您的目的,您甚至可以使用pipe()
将可写流附加到process.stdin
。