世界最速のCSSセレクタ(getElementsBySelector とか querySelectorAll みたいなもの)をリリースしました。

http://code.google.com/p/uupaa-js-spinoff/

2008-10-11 追記 uupaa-selector.js version 1.2 をリリースしました。 - latest log

おまたせ

最新のjQuery(1.2.6)よりも早く、jQueryと比較にならないほどの高い精度で正しく動作するCSS3セレクタの実装(uupaa-cssselector.js)をリリースしました。

uupaa-cssselector.js は uupaa.js (ver 0.7) の機能の一部を切り出し、スタンドアローンJavaScriptとして動作可能な状態にパッケージし直したものです。
そのため、一部の機能(:link :visited :hover :focus) はご利用になれません。ver 1.1以降で使用可能になりました。

使い方

document.body 以下の div要素 以下の p要素で、上から4,8,12,16...番目の要素を選択。

<script type="text/javascript" src="uupaa-cssselector.js"></script>
<script>
  var node = document.getElementsBySelector("div p:nth-child(4n+1)", document.body);
  for () { ... }
</script>

document.getElementsBySelector() が「長すぎる」という方は、以下のようにしてもご利用いただけます。

<script type="text/javascript" src="uupaa-cssselector.js"></script>
<script>
  var $$ = document.getElementsBySelector;
  var node = $$("div p:nth-child(4n+1)", document.body);
  for () { ... }
</script>

なぜに最速と言い切れるのか?

上記とまったく同じ速度比較を、メジャーなライブラリ(MooTools, jQuery, Prototype, YUI, Dojo)で行っている結果が http://mootools.net/slickspeed/ で確認できます。この中では jQuery1.2.6 が最速なので、jQueryよりもより高速な uupaa が世界最速ということになります(たぶん)。

ベンチマークツール(slickspeed)の品質にちょっと問題がある(統計やバラつきを考慮していない)ようで、実行毎やブラウザ毎にかなりブレが出るようです。
なので、JavaScriptの遅さに定評のある(安定した結果の出る) IE6 で見ることをお勧めします。

MooTools jQuery Prototype YUI Dojo uupaa cssselector kQuery
Chrome 111 99 443 409 111 64 60 60
Safari3.1.2 104 151 228 425 130 12 4 4
Opera9.27 256 242 391 825 124 1638 328 435
Opera9.6β 192 136 196 474 84 1295 156 206
IE6 595 386 2317 1580 696 3062 337 502
IE8 364 242 1403 1022 303 1852 191 301
Firefox2 326 273 275 789 200 4394 349 485
Firefox3 143 150 262 338 103 1496 163 234
Total 2091 1679 5515 5862 1751 13813 1588 2227
Total(Webkit抜き) 1876 1429 4844 5028 1510 13737 1524 2163

MooTools 1.2, jQuery 1.2.6, Prototype.js 1.6.0.2, YUI 2.5.2 β, Dojo 1.1.1, uupaa.js 0.6, uupaa-cssselector.js, kQuery

制限事項

  • uupaa.js (ver 0.6以降)でサポートされている、一部の擬似クラス(:link :visited :hover :focus) は、uupaa-cssselector.js ではご利用になれません。
  • :not は 未実装です。

これまでの経緯等は、過去のエントリを参照してください。

コードリードする方は、uupaa.js ver 0.6 のコードを一度読んでから、uupaa-cssselector.js のコードを読むと、とても分かり易いと思います。

追記

Ext.js の存在を忘れていたので追試してみました。
Ext.js(2.2), uupaa.js(0.7 - 10/4の最新版)

Ext.js は内部でクエリ文字列を JavaScript コードにコンパイルしキャッシュ(+ evalで評価)するため、上記と同じ方法では正確な数字がわかりません。

仕方ないので、slickspeed を改造(通常では4回計測するところを1回だけに)した状態で計測しています。

Browser Ext uupaa
IE6 139 125
IE7 62 110
Opera9.27 92 109
Opera9.6β 62 31
Firefox2 186 171
Firefox3 288 217
Safari3.1 16 0
Chrome 67 35
Total 912 798

セーフ。

Ext.js は早いことは早いのですが…
http://pigs.sourceforge.jp/blog/200809192139/ext_css/test.html
CSS セレクタとしての精度はメジャーなライブラリの中で最低点(Firefox3で366点)でした。

Ext.js の特性(中身)を理解せずに無改造の slickspeed でベンチ取って、「Ext.js は 爆速だ」とブログで語っているアメリカ人(?)とか見かけました。さすがドラッグレース発祥の国。