当前位置: 首页 > 知识库问答 >
问题:

为什么这个节点。js循环在112050次迭代后运行缓慢?

锺离穆冉
2023-03-14

我在玩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()

我使用不同的值进行了实验,发现1-112050需要3秒,而1-112051需要一分钟。这种突然的下降很奇怪。python中的相同程序或等效的shell脚本“seq 1 112051”在合理的时间内(0-2秒)运行。

请注意,此节点。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')

谁能给我解释一下为什么是node。js的行为是这样的,为什么衰减如此突然?

共有3个答案

廖君昊
2023-03-14

我相信这可能是特定于环境的,您是在什么背景下编写的?起初我以为这是为了一个网站,但这涉及到写文件,这让我很反感。

否则,使用文件系统会很有趣,这取决于实现情况。我不应该责怪编程语言,但我真的不知道javascript如何在您的特定系统上处理文件IO,文件IO中的性能本身就是一门科学,可能与计算机科学本身一样古老。

松雅昶
2023-03-14

这是一个被填满的缓冲区。根据内核缓冲区的状态,每次写入都将返回true或false。

如果您开始侦听返回代码并使用drain事件,它至少在速度上是一致的。

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
雷浩思
2023-03-14

这是因为for循环是同步的,但可写。write()不是。例如,s.write创建了一百万个chuncks队列。这会导致超过一百万个函数调用(像这样)来处理此队列。因此,<代码>可写。写入不是为小块而设计的。您可以检查可写的源代码。编写以获取有关它的更多信息。

 类似资料:
  • 考虑这个简单的C++函数来计算数组的前缀和: 它是4个融合的UOP1,这个CPU可以支持4个融合的OPs/周期。 有通过和携带的依赖链,每个都是一个循环,但是这些UOP可以到4个ALU端口中的任何一个,所以似乎不太可能冲突。融合的需要转到p6,这是一个更令人担忧的问题,但我只测量到p6的1.1 UOPS/迭代。这将解释每次迭代1.1个循环,但不是1.4个循环。如果我将循环展开2倍,端口压力会低得多

  • 我一直在读一本面向初学者的书,“第一头HTML5编程”,其中有这样一段代码: 目前,如果我调用,它将返回下一次显示是在下午5:00。我将循环条件更改为“I<=movie.showtimes.length;”但它仍然只运行一次,并且只显示下午5点。循环只迭代一次,即使我重写了这个函数: 不是应该跑两次吗?

  • 我发现这样的php代码: 我希望这个循环会执行4次,因为$I变成了对$的引用(对吗?)。然而,循环只执行一次,并输出: a=10,i=10 我不明白为什么它会这样工作。有什么想法吗?

  • 当我像这样做一个常规的while循环时 它打印 但第二个while循环在满足条件后再次运行。 所以结果是 “佛罗多是一个很好的霍比特人的名字”难道它不应该停止印刷吗 我设置了x的条件 编辑:哦,我现在明白了,哈哈,我想增量是在代码的末尾,开始是0

  • 问题内容: 我有下面的代码: 有谁对我如何延迟循环中的每个循环的建议?假设代码在每次迭代完成后等待10秒。我试过了,但没有设法解决。 问题答案: 您可以设置超时时间,以增加代码间隔,如下所示: 因此,第一个立即运行(间隔* 0为0),第二个在十秒钟后运行,依此类推。 您需要在中作为最终参数发送,以便将其值绑定到function参数。否则,尝试访问数组值将超出范围,您将获得。

  • 问题内容: 在Solaris SPARC机器上对一些Java代码进行基准测试时,我注意到我第一次调用该基准测试函数时,它运行EXTREMELY的速度很慢(相差10倍): 第一| 1 | 25295.979毫秒 第二| 1 | 2256.990毫秒 第三 1 | 2250.575毫秒 为什么是这样?我怀疑是JIT编译器,有什么办法可以验证这一点? 编辑: 根据一些答案,我想澄清一下这段代码是我可以发