素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

XPathはDOM+JSより速いのか

XPathと、getElementsBy〜の速度比較。

はてなハイク - お絵かきも楽しめるミニブログからclass名がentryである要素を抽出する場合。

console.time('speed');
for(var i=0;i<100;i++)document.getElementsByClassName('entry')
console.timeEnd('speed');

console.time('speed');
for(var i=0;i<100;i++)document.evaluate('//*[@class="entry"]',document,null,7,null)
console.timeEnd('speed');

DOM:speed: 2ms
XPath:speed: 123ms
単純にクラス名で指定する場合は圧倒的にgetElements〜のほうが速い。しかも生きたNodeList。

では、もう少し複雑な場合。
Bookmarklet - はてなハイクから、class名がprofile-imageで、altがjavascripterであるimg要素を抽出する場合。

console.time('speed');
for(var i=0;i<100;i++)Array.filter(document.getElementsByClassName('profile-image'),function(i)i.alt=='javascripter');
console.timeEnd('speed');

console.time('speed');
for(var i=0;i<100;i++)document.evaluate('//*[@class="profile-image" and @alt="javascripter"]',document,null,7,null)
console.timeEnd('speed');

DOM:speed: 36ms
XPath:speed: 109ms
まだDOMのほうが速い。

もっと複雑な場合。
はてなハイク - お絵かきも楽しめるミニブログから、親要素がpで、そのクラス名がusernameで、子のa要素のテキストがjavascripterである要素を取得する場合。

console.time('speed');
for(var i=0;i<100;i++)document.evaluate('//a[../../p[@class="username"] and text()="javascripter"]',document,null,7,null);
console.timeEnd('speed');

console.time('speed');
for(var i=0;i<100;i++)Array.filter(document.getElementsByTagName('a'),function(i)i.parentNode.className=='username' && i.textContent=='javascripter');
console.timeEnd('speed');

DOM:speed: 176ms
XPath:speed: 78ms

XPathのほうが速い。

ということで、取得するものが単純な場合はDOMを使って、
Greasemonkeyとかで他人のサイトを弄る場合のように、自由にできないときはXPathを使えばいいと思う。

100回して2秒未満だからそこまで気にする必要ないとは思うけど。