从标准input读取大节点的input

我必须能够读取标准input(10 ^ 5空格分隔的数字)的大input。 任何超过10 ^ 3和readline的input只需要200秒就可以读取,我需要在不到5秒的时间内完成。 我应该使用除readline以外的东西,还是有一种方法来增加readline的缓冲区或什么?

readline就像它在锡上说的那样,是为了读取线条而devise的。 由于你的空间分隔的数字(可能)都在一条很长的线上,所以readline有麻烦并不令人惊讶。

使用Transformstream可以很容易地解决这个问题,但是您不必因为某人已经为您完成了工作。 看看split2模块,该模块获取数据stream并将其分割到给定的分隔符处。 你会这样使用它:

 const split2 = require('split2'); process.stdin .pipe(split2(' ')) .pipe(process.stdout); 

在我的机器上(MacBook Pro,Intel Core i7),上述数字为100,000个空格分隔数字为0.41s,1,000,000个数字为2.06s。

当然,这是非常无用的。 假设我们想要总结数字:

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

这在我的机器上总计1e5数字0.28s,1.87s总计1e6。 (为什么它更快?大概是因为它只写一行输出,而写入STDOUT显然比parsing和添加更昂贵。)

检查process.stdin

根据你想要做什么,你甚至可以使用pipe()把一个Writablestream附加到process.stdin