node.js - 112050次迭代之后,为什么 node.js 循环运行缓慢?

  显示原文与译文双语对照的内容
0 0

我在玩节点jsblocks我发现这个简单的程序处于运行非常慢,而且我都没看到周围花费时间3 分钟后已经过了

var fs = require ('fs')
var s = fs.createWriteStream("test.txt");
for (i = 1; i <= 1000000; i++)
      s.write(i+"n");
s.end()

我实验时使用不同的值,结果发现1 112050需要3 秒,1 112051接管一下 这突如其来的dropoff不对头 同一个程序在python中,或等效的shell脚本'seq 1 112051`在合理的时间内运行( 0 2 秒) 。

请注意,此节点jsblocks应用跑得快多了:

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

谁能向我解释,为什么节点jsblocks行为的dropoff这样,为何如此突然?

时间:原作者:6个回答

0 0

是的缓冲区获取空了。 每次写入将返回 truefalse根据内核缓冲区的状态。

如果启动听返回代码并使用排水管事件,它将至少consistant在速度。

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

输出:

$ 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
原作者:
0 0

发生这种情况是因为 for周期是同步的,但 Writable.write()不是。 为示例s write创建一百万 chuncks队列。 导致超过一百万函数调用( 这样 ) 来处理此队列。 所以, Writable.write不适用于小型区块。 可以 检查源的 Writable.write有办法的相关详情。

原作者:
0 0

我相信这可能是特定于环境,在怎么样的情况下你编码? eg,最初我以为的网站,但它涉及到写文件后者在完成时throw我怎么做?

否则,使用文件系统工作有趣根据实现,我不是人指责编程语言但我真的不知道java script如何处理文件IO文件IO中在特定系统上,性能是一个科学本质,可能一样老计算机科学本身。

原作者:
...