È lento per una serie di motivi. Il più ovvio è il fatto che nessuno lo usa così semplicemente molto meno tempo è stato speso per ottimizzarlo. L'altro problema è che rientra massicciamente, ogni nodo deve chiamare in JS ed eseguire la funzione filtro.
Se si guarda a revision three of the benchmark, si scopre che ho aggiunto una reimplementazione di ciò che sta facendo l'iteratore utilizzando getElementsByTagName("*")
e quindi eseguendo su di esso un filtro identico. Come mostrano i risultati, è enormemente più veloce. Going JS -> C++ -> JS è lento.
Il filtro dei nodi interamente in JS (il caso getElementsByTagName
) o in C++ (il caso querySelectorAll
) è molto più rapido rispetto a farlo attraversando ripetutamente il confine.
Nota anche corrispondenza di selezione, come utilizzato da querySelectorAll
, è relativamente intelligente: lo fa corrispondenza da destra a sinistra e si basa sulla cache pre-calcolate (la maggior parte dei browser iterare su una lista memorizzata nella cache di tutti gli elementi con la classe " klass ", controlla se si tratta di un elemento a
e poi controlla se il genitore è un div
e quindi non si preoccuperanno nemmeno di iterare sull'intero documento.
Dato che, quando utilizzare NodeIterator? Fondamentalmente mai in JavaScript, almeno. In linguaggi come Java (indubbiamente il motivo principale per cui esiste un'interfaccia chiamata NodeIterator), sarà probabilmente altrettanto veloce di qualsiasi altra cosa, poiché il filtro sarà nella stessa lingua del filtro. A parte questo, l'unica altra volta che ha senso è nelle lingue in cui l'uso della memoria di creare un oggetto Nodo è molto maggiore della rappresentazione interna del Nodo.