少しだけ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とかの自分用メソッドを拡張なんかしちゃったりして、重そうな処理を削れば結構快適になるがいいかもね。
最近はファウラーのリファクタリングを読んでいるけど、最初からうまく行く設計なんてないよねー。全く何もないところからはさすがに無理だと思うけど、思いついたらその都度設計を変えていけばいいと思うんだよね。で、今回はリファクタリングを結構していたため、パフォーマンス改善周りもやりやすかったのは感激。
しかし職業としてプログラミングをしていると、構造の正しさ、美しさやアルゴリズムよりも、泥臭い対応の方が現実的だったりするのが、なんというか、そういうのちょっと嫌。
Shin Ohno 2003-2012