Object.create(null)

TypeError: Cannot convert object to primitive value

Node.js で異なるオブジェクトを親にして Object.create すると速度が死ぬ話

なんですぐ死んでしまうん.

以下の 2 つをご覧ください. 前者 (A) は毎回同じオブジェクトを親にして Object.create() でオブジェクトを作成, 後者 (B) は違うオブジェクトを親にしています.

console.time("A");
var parent = {};
var dummy;
for (var i = 0; i < 100000; i++) {
    dummy = {};
    dummy = Object.create(parent);
}
console.timeEnd("A");
console.time("B");
var parent = {};
var dummy;
for (var i = 0; i < 100000; i++) {
    parent = {};
    dummy = Object.create(parent);
}
console.timeEnd("B");

てきとーに試しただけですが, Node.js v5.2.0 では B (違うオブジェクトを親) の方が A より 7.6 倍くらい遅くなりました. v0.12.7 とかでも同様に B の方が遅くなります.

Chrome 47.0.2526.80, Firefox 42.0, Safari 9.0.1 でも試しましたが, まず, FirefoxSafari は共に B の方が 2 〜 3 倍程度遅くなります. おそらく A はキャッシュされるとかそういうのがあるのでしょう. 一方 Chrome はなぜか A, B はほぼ同じで, ただし A は Node.js の場合の 30 倍, B も同様に 4 倍くらい遅くなっていました. もうよくわかりません.