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?

È stato utile?

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

  1. 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.

  2. 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:

Array Bounds Check Elimination

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top