CSSセレクタにテコ入れした

# 昨日の日記の続きです。

Browser Test kQuery uupaa.js
+ テコ入れ
peppy
(cache on)
peppy
(cache off)
sizzle-0.9 jQuery 1.2.6
IE6 A0 248 153 287 294 338 369
A1 611 604 1447 1507 1420 1100
IE7(別PC) A0 144 116 - - 266 306
Firefox2 A0 294 237 138 386 515 398
A1 647 541 408 356 1464 841
Firefox3 A0 142 115 38 102 193 176
A1 259 207 157 176 489 360
  • Test A0: SlickSpeed のデフォルトのテスト項目(利用頻度が高い項目をテスト)
  • Test A1: ofk さんのテスト項目(利用頻度が低い項目もテスト)

ひとこと

  • kQuery: IE5.0でも動作するセレクタというカテゴリの中では、間違いなく世界最速(たぶんこの先もずっと)
  • uupaa+テコ入れ: uupaa.js 0.7 に乗せる予定のCSSセレクタ(:visited とキャッシュのサポートはオプショナル, :not は一部のみサポート)
  • peppy: sizzle のライバル。この中では唯一キャッシュを搭載(詳しくは過去の記事参照)
    • 速く見えるのは気のせい。
  • sizzle-0.9(jQuery 1.3β1): ほとんどのブラウザで遅くなり、精度も悪化。
  • jQuery: みんな大好き jQuery

テコいれ後のソースコード

uupaa+テコ

jQuery独自セレクタ:visited 用のコードは削ってます。

CSSセレクタの概要をちょっとだけ説明

自作のCSSセレクタは、大きく2つのブロックに分けて検索処理を実装することで、速度と精度を両立させています。

前段の Quick Phase で速度を稼ぎ、後段の Generic Phase で精度を保障する仕組みとなっています。

Quick Phase の役目

Quick Phase (Line239〜298, Line328〜354) は、速度にフォーカスした処理だけを記述してある部分です。速度が必要な場合は、Quick Phase に処理を追加します。

今回のテコ入れでは、ここに処理を追加しました。

追加したのは、以下の2つです。

  • "#id ..." や ".class ..." を高速に処理するため、 QUICK_HEAD を追加
  • "#id, #id, .class" を高速に処理するため、QUICK_COMMA を追加

このような特殊化の余地はまだ十分に残されているため、今後も速度で抜かれるようなことが(もし)あったとしても、すぐに逆転できます。

Generic Phase の役目

Generic Phase (Line357〜547) は、精度にフォーカスした処理だけを記述してある部分です。Generic Phase はメンテナンス性を第一に考えて組んであるため、非常にシンプルです(簡単に読めると思います)

精度に関わる部分なので、今回のテコ入れでも一切ロジックを修正していません。
精度は抜かれる心配がありません(:not 以外のW3Cのテストを全パスしているので)。


このように役割を明確にして組んであるので、今回のようなケースにも対応できているんだと思います。

反省会

  • 技術競争の結果が速度(数値)で見れるってのは分かりやすいね。
    • 私とid:ofkさんのほかに、もう一人ぐらい日本人でCSSセレクタの作者がいてもいいと思うんだな。
      • いまや世界で一番強い通貨を持つ国なので、もうちょっと世界に出てみてもいいんじゃないかと。