2011-08-31 16 views
10

Ho letto più recentemente sull'efficienza dei diversi motori di selezione. So che jQuery usa il motore Sizzle e this blog post su alcune cose di jQuery menzionate che il motore Sizzle farà a pezzi il tuo selettore in un array e poi analizzerà da sinistra a destra.Selettori jQuery, efficienza

Quindi, da destra a sinistra, inizia a decifrare ogni elemento con espressioni regolari. Ciò significa anche che la parte più corretta del tuo selettore dovrebbe essere il più specifica possibile, ad esempio un id o un nome di tag.

La mia domanda è se sia più efficiente per eseguire un selettore con solo l'ID specificato o il nome del tag così:

var div = $('#someId'); 
//OR 
var div = $('div#someId'); 

che non scrivo il mio CSS in forma div#someId tendo per fare i miei selettori allo stesso modo, sto facendo sì che Sizzle esegua un lavoro extra (supponendo che QuerySelectorAll non sia disponibile)?

+1

Ottima domanda! Stavo pensando di fare una domanda simile me stesso. –

+1

Per le domande relative alle prestazioni, la soluzione migliore è di solito provarla tu stesso. jsperf.com può aiutarti a eseguire il benchmarking di snippet javascript. – Eduardo

risposta

14

jQuery e Sizzle ottimizzare il selettore #id[source]-document.getElementById(id). Penso che non siano in grado di ottimizzarlo in questo modo con lo tag#id.

Il primo è più veloce.

Il BTW che specifica il nome del tag per un selettore #id ha una sovra-specifica, poiché può esistere un solo tag con un determinato ID sul documento. La sovra-specifica è più lenta even in CSS.

+0

Grazie della tua risposta e jsPerf di @ lonesomeday ha risposto alla mia domanda completamente. A quanto pare ho bisogno di cambiare il mio stile di sviluppo – Chad

1
var div = $('#someId'); //should be faster 

jQuery utilizzerà getElementById() per il selettore sopra

var div = $('div#someId'); //would probably preform slower due to finding all the divs first 

jQuery utilizzerà getElementsByTagName(), quindi scorrere anche se l'array di elementi per il selettore sopra

Si dovrebbe anche ricordare, i nomi dei tag dovrebbe utilizzabile con selettori di classe (ove possibile)

var div = $('div.myclass') //faster than the statement below 

contro

var div = $('.myclass') //slower 
+0

Perché? (Dato che il browser ha document.getElementsByClassName ora?) – arnaud576875

+1

@ arnaud576875 getElementsByClassName non è disponibile in tutti i browser. Ne farà uso se è disponibile, ma i browser più vecchi non supportano la funzione. Come ad esempio IE 7 –

+0

Questo ha senso :) – arnaud576875

4

Se si utilizza jQuery, si può assumere un browser con getElementById. $('#someId') può essere convertito in document.getElementById('someId'). $('div#someId') non lo sarà, quindi sarà più veloce perdere il nome del tag.

jsPerf demonstrating this. La differenza è enorme.

+0

Incredibile, la differenza di velocità qui era sorprendente. Dovrò valutare come faccio i miei selezionatori. Avevo l'impressione che fosse abbastanza intelligente convertire '$ ('div # someID')' in 'getElementById ('someID')' ma ha senso che sto aggiungendo un altro vincolo nel mio selettore, deve essere un 'div'. Grazie per questo. – Chad

0

JsPerf: http://jsperf.com/jquery-id-vs-tagname-id

La prima sta per essere più veloce perché ha solo per controllare l'ID. Il secondo esegue lo stesso controllo E deve assicurarsi che il tagname sia corretto. div#id non vi darà l'elemento con id id a meno che non si tratta di un div

8

Invece di speculare, misuriamolo!

Ecco un caso di test con questa pagina caricata, quindi corrispondente a un elemento casuale con entrambi i metodi.

Assicurarsi di scorrere verso il basso fino in fondo.

http://jsperf.com/which-jquery-sizzle-selector-is-faster#runner

Come ci si potrebbe aspettare, un id pianura è più veloce di un tag un qualificato (riduzione a getElementByID). Questo è lo stesso quando si usano le classi.

La selezione per ID è molto più veloce rispetto alla selezione per classe, principalmente perché gli ID sono garantiti come unici.

0

Qui è possibile vedere il codice sorgente: http://code.jquery.com/jquery-1.6.2.js nella funzione init.

Il selettore più veloce è $('') che restituisce immediatamente un oggetto jQuery vuoto.

$('body') è prossima, che jQuery converte document.body

La seguente è $('#id') che utilizza document.getElementById('id').

Qualsiasi altro selettore come $('div#id') diventerà semplicemente una chiamata a $(document).find('div#id'). find() è molto complesso rispetto a qualsiasi altra soluzione e utilizza Sizzle JS per selezionare il div.