GANCHIKU.com

少しだけgetElementsByClassNameを効率化。

って、本当に少しだけ。。

getElementsByClassNameは遅いというのは有名な話だけども、少しだけ効率化してみた。って、メッチャ情けない効率化だけども、一応効果はあるんだぜ。IE限定だけどね。私の環境のXPathのないIEではだいぶ速くなったよ。MozillaはそのままXPathにお任せ。

まぁ、getElementsByClassNameにタグも指定できるようにしただけ。つーか、本当にいじったのほんの少し。。。orz
だいたいclass指定は同じ要素にすることが多いと思うんだけど、getElementsByClassNameでは、getElementsByTagNameで全て持ってきちゃっているのね。ここを少しだけ改良しただけ。

document.getElementsByClassNameAndTagName = function(className,
parentElement, tagName) {
 if (Prototype.BrowserFeatures.XPath) {
     return $(parentElement).getElementsByClassName(className);
 } else {
   var children = $(parentElement).getElementsByTagName(tagName || '*');
   var elements = [], child;
   for (var i = 0, length = children.length; i < length; i++) {
    child = children[i];
     if (Element.hasClassName(child, className))
       elements.push(Element.extend(child));
   }
   return elements;
 }
}

えと、他にもprototype.jsのDOM操作はヤヴァイね。下手に使うと遅すぎ。。。next, previous, up, downとか。。。どこかにも書いてあったけど、引数を付けるとダメダメ。付けなくてもダメだけど。。まぁ、最初はカッコよく書くためにprototype.jsで書いて、それから効率化するときに適当にnextElementとかの自分用メソッドを拡張なんかしちゃったりして、重そうな処理を削れば結構快適になるがいいかもね。

最近はファウラーのリファクタリングを読んでいるけど、最初からうまく行く設計なんてないよねー。全く何もないところからはさすがに無理だと思うけど、思いついたらその都度設計を変えていけばいいと思うんだよね。で、今回はリファクタリングを結構していたため、パフォーマンス改善周りもやりやすかったのは感激。

しかし職業としてプログラミングをしていると、構造の正しさ、美しさやアルゴリズムよりも、泥臭い対応の方が現実的だったりするのが、なんというか、そういうのちょっと嫌。

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Shin Ohno 2003-2012