È costoso eseguire array.length o list.count in un ciclo
-
06-07-2019 - |
Domanda
So che in JavaScript, creare un ciclo for come questo: for(int i = 0; i < arr.length; i++)
è costoso in quanto calcola la lunghezza dell'array ogni volta.
Questo comportamento è costoso in c # anche per elenchi e matrici. O in fase di compilazione è ottimizzato? E che dire di altre lingue come Java, come viene gestita?
Soluzione
È non costoso in C #. Per prima cosa, non esiste & # 8220; calcolo & # 8220 ;: interrogare la lunghezza è sostanzialmente un'operazione elementare grazie all'allineamento. In secondo luogo, perché ( secondo i suoi sviluppatori ), il compilatore riconosce questo modello di accesso e ottimizzerà di fatto qualsiasi controllo (ridondante) dei limiti per l'accesso sugli elementi dell'array.
E comunque, credo che qualcosa di simile sia vero per le moderne macchine virtuali JavaScript, e se non lo è già, lo sarà molto presto poiché si tratta di una banale ottimizzazione.
Altri suggerimenti
-
Tutti gli array .Net hanno un campo contenente la lunghezza dell'array, quindi la lunghezza non viene calcolata durante l'utilizzo ma al momento della creazione.
-
La macchina virtuale .Net è molto brava a eliminare i controlli dei limiti ogni volta che è possibile, questo è uno di quei casi in cui il controllo dei limiti viene spostato al di fuori del ciclo (nella maggior parte dei casi, e in caso contrario si tratta solo di 2 istruzioni generali ).
Modifica:
In quasi tutte le lingue, la risposta sarà " dipende " ;.
Principalmente, dipende dal fatto che il compilatore sia abbastanza intelligente da essere in grado di dire se la lunghezza dell'elenco o dell'array potrebbe cambiare mentre sei nel ciclo.
È improbabile che sia definito dalle specifiche del linguaggio.
Quindi, probabilmente è sicuro supporre che la compilazione potrebbe non essere in grado di capirlo. Se credi davvero che la lunghezza dell'oggetto non cambierà, sentiti libero di calcolare prima la lunghezza e usarla nei costrutti di controllo del loop.
Ma attenzione agli altri thread ...
Se è qualcosa come Java, dovrebbe essere un'operazione O (1).
Ho trovato utile il seguente link: http: //www.devguru. com / Tecnologie / ECMAScript / QuickRef / array.html
Dipenderà anche dal fatto che quel getter stia facendo un calcolo o acceda a un valore noto.
Credo che se usi il metodo di estensione Linq Count (), allora può calcolare ogni volta che viene chiamato.