風柳メモ

ソフトウェア・プログラミング関連の覚書が中心

FirefoxのouterHTMLを少しだけ高速化する

id:amachangこの記事を見て

このコードを実行すれば Mozilla 系のブラウザでも outerHTML が使えるようになります。

Firefox に outerHTML を実装する - IT戦記

cloneNode(true)するとちょっと重いかもな〜と思って、少しいじってみる。

cloneNode(false)にしてみた

(function(work,reg_inspnt){
    if (document.documentElement.outerHTML) return;
    HTMLElement.prototype.__defineGetter__('outerHTML',function(){
        work.appendChild(this.cloneNode(false));
        var html=work.innerHTML.replace(reg_inspnt,'$1'+this.innerHTML+'<');
        while (work.firstChild) delete work.removeChild(work.firstChild);
        return html;
    });
})(document.createElement('div'),/(>[^<]*)</);

どこか問題有る気もするが(汗)

ふたつの速度比較

適当なページをFirefoxで開いた状態で、

javascript:(function(d){var%20s=d.createElement('script');s.charset='UTF-8';s.src='http://furyu-tei.sakura.ne.jp/script/benchmark_outerHTML.js?ver=';+(new%20Date).getTime();d.documentElement.appendChild(s);})(document)

を実行すれば、速度比較が出来ます。
(1)がamachangさんの方式、(2)が上記方式の結果。
ベンチマークの内容は、ページ内の全要素について、outerHTMLを参照しています。
この記事のページで(試した時点で487要素)、(1) 401 ms vs (2) 95 ms でした。揺れは大きいけれども。