documentにnodeを追加するタイミング
Firefoxでは、documentにnodeを追加するタイミングで実行速度に差がでるようです。
- documentにnodeを追加してからnodeを組み立てる ⇒ 遅い
- nodeを組み立ててからdocumentに追加する ⇒ 速い
他のブラウザでは調べていませんが、どうなんでしょう。
about:blankでJavaScript Shellを開き、以下のスクリプトをペーストして実験しました。
// SLOW var t = new Date().getTime(); var node = document.createElement("span"); document.body.appendChild(node); // <======= for (var i = 0; i < 10000; i++) { node.appendChild(document.createTextNode("a")); } print(new Date().getTime() - t);
// FAST! var t = new Date().getTime(); var node = document.createElement("span"); for (var i = 0; i < 10000; i++) { node.appendChild(document.createTextNode("a")); } document.body.appendChild(node); // <======= print(new Date().getTime() - t);
上のは5200ms前後、下のは900〜1600msくらいでした。
参考
(追記)
この記事を書いた直後に、同じ問題でまた悩みました(頭悪い)。。
documentに関連付けられたあるサブツリーの要素を、別の要素の子に移し変えて、最後にそのサブツリーを丸ごと入れ替えるような処理をしていたんですが、先にremoveChildで入れ替えるサブツリーとdocumentの関連を断ち切ったところ、3〜4倍速くなりました。
あるサブツリーに操作を加える場合、一度documentから切り離して操作した後、もう一度documentに書き戻すことで速度が改善する場合がありそうです。