Node.js uncaughtException から Domain へ移行

今後 uncaughtException での実装は非奨励になり domain に置き換わるらしいです。
https://github.com/joyent/node/commit/e8af3405574dfee2cb8c11bf27195b774332db96

というわけで、移行のメモ。

process.on('uncaughtException', function(err) {
  console.log(err.message); 
});

// 何らかの処理

var domain = require('domain');
var d = domain.create();

d.on('error', function(err) {
  console.log(err.message); 
});
d.run(function() {
  // 何らかの処理
});

ついでに 移行前と移行後のベンチマークをとってみました。

$ time node bench-uncaughtException.js 
real  0m9.801s
user  0m8.197s
sys   0m3.544s
$ time node bench-domain.js 
real  0m11.794s
user  0m10.240s
sys   0m3.445s


実行環境はMBA。Node のバージョンは v0.8.2 です。
(7/20追記: Node v0.8.3 もほぼ同じ結果でした)
グラフは右に長いほど遅くなります。
ちょっと無視できない差が出ていますが、Node.js の開発も過渡期でしょうし今後に期待。

[ bench-uncaughtException.js ]

var fs = require('fs');

var cnt = 0;
process.on('uncaughtException', function(err) {
  cnt++; 
});
for (var i=0; i<200000; i++) {
  fs.readFile('not_found', 'utf-8', function(err, data) {
    if (err) throw err;
  });
}

[ bench-domain.js ]

var fs = require('fs');
var domain = require('domain');

var d = domain.create();
var cnt = 0;
d.on('error', function(err) {
  cnt++; 
});
d.run(function() {
  for (var i=0; i<200000; i++) {
    fs.readFile('not_found', 'utf-8', function(err, data) {
      if (err) throw err;
    });
  }
});