13

私は 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 には 1 分以上かかることがわかりました。この突然のドロップオフは奇妙です。Python の同じプログラム、または同等のシェル スクリプト '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')

node.js がこのように動作する理由と、ドロップオフが突然発生する理由を説明できる人はいますか?

4

3 に答える 3

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

出力:

$ 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
于 2013-01-30T01:15:28.990 に答える
-3

これは環境固有のものである可能性があると思います。どのようなコンテキストでこれをコーディングしていますか? たとえば、最初はウェブサイト用だと思っていましたが、ファイルを書く必要があり、気が遠くなりました。

それ以外の場合、実装によってはファイルシステムの操作が面白くなります。私はプログラミング言語を非難する人ではありませんが、特定のシステムでjavascriptがファイルIOをどのように処理するかは本当にわかりません.ファイルIOのパフォーマンスはそれ自体が科学です.おそらくコンピュータサイエンス自体と同じくらい古い。

于 2013-01-28T00:10:22.547 に答える