Ton*_*ndo 13 io performance file-io loops node.js
我正在玩node.js,我发现这个简单的程序运行速度非常慢,我甚至没有等到3分钟过后花了多长时间.
var fs = require ('fs')
var s = fs.createWriteStream("test.txt");
for (i = 1; i <= 1000000; i++)
s.write(i+"\n");
s.end()
Run Code Online (Sandbox Code Playgroud)
我尝试使用不同的值,发现1-112050需要3秒,1-112051需要一分钟.这种突然下降很奇怪.python中的相同程序或等效的shell脚本'seq 1 112051`在合理的时间内(0-2秒)运行.
请注意,此node.js应用程序运行速度更快:
var fs = require('fs')
, s = []
for (var i = 1; i <= 1000000; i++) s.push(i.toString())
s.push('')
fs.writeFile('UIDs.txt', s.join('\n'), 'utf8')
Run Code Online (Sandbox Code Playgroud)
任何人都可以向我解释为什么node.js会这样做,以及为什么下降是如此突然?
小智 6
这是一个填满的缓冲区.每次写入都将返回true或false取决于内核缓冲区的状态.
如果你开始听返回代码并使用排水事件,它至少会保持速度一致.
var fs = require ('fs')
function runTest(stop) {
var s = fs.createWriteStream("test.txt");
var startTime = Date.now();
var c = 1;
function doIt() {
while (++c <= stop) {
if (!s.write(c+"\n")) {
s.once('drain', doIt);
return;
}
}
s.end();
var diffTime = Date.now() - startTime;
console.log(stop+': took '+diffTime+'ms, per write: '+(diffTime/stop)+'ms')
}
doIt();
}
runTest(10000);
runTest(100000);
runTest(1000000);
runTest(10000000);
runTest(100000000);
Run Code Online (Sandbox Code Playgroud)
输出:
$ node test.js
10000: took 717ms, per write: 0.0717ms
100000: took 5818ms, per write: 0.05818ms
1000000: took 42902ms, per write: 0.042902ms
10000000: took 331583ms, per write: 0.0331583ms
100000000: took 2542195ms, per write: 0.02542195ms
Run Code Online (Sandbox Code Playgroud)