4

jQueryでのセレクターと同等の関数の使用についてよく疑問に思いました。これは、同じ結果セットを返す同じコンポーネントを含むが、構成が異なるステートメントを意味します。

次の例を見てください。

alert($("#FundManager1>option").length);
alert($("#FundManager1").find("option").length);

(注:意図は2つの同等のクエリです-これらが常に同じであるとは限らない場合は、これを指摘していただければ幸いです)

それで、上記の例を考えると、速度/パフォーマンスに実際の違いはありますか?明らかに、前者の方が短いので、アップロード/ダウンロードされるバイト数が少なくなりますが、現時点ではあまり興味がありません。

4

1 に答える 1

5

1つ目はCSSセレクターを1つだけ解析し、子のみを検索するため、最初の方が高速です。2つ目は、2つを解析する必要があり、さらにすべての子孫を検索する必要があります。

しかし、私はそんなに小さなことを気にしません。JavaScriptはWebKitとGeckoで非常に高速であり、IEでも比較的高速であるため、誰もその違いに気付くことはありません。


jQuery / Sizzleソースを見るとわかることから、両方のコードは内部的に同じことをします。

最初document.getElementById('FundManager1')に実行され(Sizzleはそれが何を意味するのかを知るのに十分賢いです#FundManager1)、次にそれoptionをコンテキストとして使用して検索が行われます。2つのコードの唯一の違いは、>セレクターの使用です。これにより、 Sizzleは、すべての子孫ではなく、コンテキストの直接の子のみを検索します。DOM階層の1つのレベルのみを調査する必要があるため、これはより高速であると思います。


別の編集:

上記のテキストは、このdocument.querySelectorAll(css_selector)メソッドをサポートしていないブラウザにのみ適用されます。これを行うブラウザー(WebKitとGecko、おそらくOpera?)では、Sizzleの代わりにこのメソッドが使用されるため、すべてのCSSセレクターの解析はjQueryフレームワークではなく、ブラウザー自体によって実行されます。

于 2010-01-14T14:18:01.083 に答える