September 5, 2007

少しだけgetElementsByClassNameを効率化。

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

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

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

  1. document.getElementsByClassNameAndTagName = function(className,
  2. parentElement, tagName) {
  3.  if (Prototype.BrowserFeatures.XPath) {
  4.      return $(parentElement).getElementsByClassName(className);
  5.  } else {
  6.    var children = $(parentElement).getElementsByTagName(tagName || '*');
  7.    var elements = [], child;
  8.    for (var i = 0, length = children.length; i <length; i++) {
  9.     child = children[i];
  10.      if (Element.hasClassName(child, className))
  11.        elements.push(Element.extend(child));
  12.    }
  13.    return elements;
  14.  }
  15. }

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

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

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

Leave a comment

Bloglines feedburner