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