400

node.jsインタープリターを使用して実行している JavaScript コードがあります。

for(var i = 1; i < LIMIT; i++) {
  var user = {
    id: i,
    name: "MongoUser [" + i + "]"
  };
  db.users.save(user, function(err, saved) {
    if(err || !saved) {
      console.log("Error");
    } else {
      console.log("Saved");
    }
  });
}

これらのデータベース挿入操作にかかる時間をどのように測定できますか? このコードの前後で日付値の差を計算することはできましたが、コードが非同期であるため、これは正しくありません。

4

13 に答える 13

248

このために設計された方法があります。process.hrtime();をチェックしてください。.

だから、私は基本的にこれをアプリの一番上に置きます。

var start = process.hrtime();

var elapsed_time = function(note){
    var precision = 3; // 3 decimal places
    var elapsed = process.hrtime(start)[1] / 1000000; // divide by a million to get nano to milli
    console.log(process.hrtime(start)[0] + " s, " + elapsed.toFixed(precision) + " ms - " + note); // print message + time
    start = process.hrtime(); // reset the timer
}

次に、それを使用して関数の所要時間を確認します。「output.txt」というテキスト ファイルの内容を出力する基本的な例を次に示します。

var debug = true;
http.createServer(function(request, response) {

    if(debug) console.log("----------------------------------");
    if(debug) elapsed_time("recieved request");

    var send_html = function(err, contents) {
        if(debug) elapsed_time("start send_html()");
        response.writeHead(200, {'Content-Type': 'text/html' } );
        response.end(contents);
        if(debug) elapsed_time("end send_html()");
    }

    if(debug) elapsed_time("start readFile()");
    fs.readFile('output.txt', send_html);
    if(debug) elapsed_time("end readFile()");

}).listen(8080);

ターミナル (BASH シェル) で実行できる簡単なテストを次に示します。

for i in {1..100}; do echo $i; curl http://localhost:8080/; done
于 2013-01-27T19:26:32.733 に答える
125

呼び出すconsole.time('label')と現在の時間がミリ秒単位で記録され、後で呼び出すconsole.timeEnd('label')とその時点からの時間が表示されます。

ミリ秒単位の時間はラベルとともに自動的に出力されるため、ラベルを出力するために console.log を個別に呼び出す必要はありません。

console.time('test');
//some code
console.timeEnd('test'); //Prints something like that-> test: 11374.004ms

詳細については、Mozilla の開発者向けドキュメントをconsole.time参照してください。

于 2014-08-03T14:28:26.983 に答える
17
var start = +new Date();
var counter = 0;
for(var i = 1; i < LIMIT; i++){
    ++counter;
    db.users.save({id : i, name : "MongoUser [" + i + "]"}, function(err, saved) {
          if( err || !saved ) console.log("Error");
          else console.log("Saved");
          if (--counter === 0) 
          {
              var end = +new Date();
              console.log("all users saved in " + (end-start) + " milliseconds");
          }
    });
}
于 2012-05-16T12:54:13.510 に答える
3

exectimerを試すこともできます。次のようなフィードバックが得られます。

var t = require("exectimer");

var myFunction() {
   var tick = new t.tick("myFunction");
   tick.start();
   // do some processing and end this tick
   tick.stop();
}

// Display the results
console.log(t.timers.myFunction.duration()); // total duration of all ticks
console.log(t.timers.myFunction.min()); // minimal tick duration
console.log(t.timers.myFunction.max()); // maximal tick duration
console.log(t.timers.myFunction.mean()); // mean tick duration
console.log(t.timers.myFunction.median()); // median tick duration

[編集] exectime を使用するさらに簡単な方法があります。コードは次のようにラップできます。

var t = require('exectimer'),
Tick = t.Tick;

for(var i = 1; i < LIMIT; i++){
    Tick.wrap(function saveUsers(done) {
        db.users.save({id : i, name : "MongoUser [" + i + "]"}, function(err, saved) {
            if( err || !saved ) console.log("Error");
            else console.log("Saved");
            done();
        });
    });
}

// Display the results
console.log(t.timers.myFunction.duration()); // total duration of all ticks
console.log(t.timers.saveUsers.min()); // minimal tick duration
console.log(t.timers.saveUsers.max()); // maximal tick duration
console.log(t.timers.saveUsers.mean()); // mean tick duration
console.log(t.timers.saveUsers.median()); // median tick duration
于 2014-08-05T13:09:32.627 に答える
2

Benchmark.jsを試してみてください。node.js も含め、多くのプラットフォームをサポートしています。

于 2012-05-16T12:30:23.453 に答える