Domanda

Quale dei seguenti ha le prestazioni migliori?

Ho visto il metodo due implementato in JavaScript con enormi miglioramenti in termini di prestazioni, tuttavia, non sono riuscito a misurare alcun guadagno in C# e mi chiedevo se il compilatore esegue già il metodo 2 anche se scritto come il metodo 1.

La teoria alla base del metodo 2 è che il codice non deve accedere a DataTable.Rows.Count ad ogni iterazione, può semplicemente accedere a int c.

Metodo 1

for (int i = 0; i < DataTable.Rows.Count; i++) {
    // Do Something
}

Metodo 2

for (int i = 0, c = DataTable.Rows.Count; i < c; i++) {
    // Do Something
}
È stato utile?

Soluzione

No, non può farlo poiché non c'è modo di esprimersi costante nel tempo per un valore.

Se il compilatore dovesse essere in grado di farlo, dovrebbe esserci una garanzia da parte del codice che restituisce il valore che il valore è costante e non cambierà per tutta la durata del ciclo.

Ma, in questo caso, sei libero di aggiungere nuove righe alla tabella dati come parte del tuo ciclo, e quindi spetta a te garantire questa garanzia, nel modo in cui l'hai fatto.

Quindi, in breve, il compilatore non eseguirà tale ottimizzazione se l'indice finale è diverso da una variabile.

Nel caso di una variabile, in cui il compilatore può semplicemente guardare il codice del ciclo e vedere che questa particolare variabile non è cambiata, potrebbe farlo e caricare il valore in un registro prima di avviare il ciclo, ma qualsiasi guadagno in termini di prestazioni da questo molto probabilmente sarebbe trascurabile, a meno che il corpo del loop non sia vuoto.

Conclusione:Se sai, o sei disposto ad accettare, che l'indice finale del ciclo è costante per tutta la durata del ciclo, inseriscilo in una variabile.


Modificare: Rileggi il tuo post e sì, potresti vedere guadagni di prestazioni trascurabili anche per i tuoi due casi, perché JITter ottimizza il codice.JITter potrebbe ottimizzare la lettura dell'indice finale in un accesso diretto alla variabile all'interno della tabella dati che contiene il conteggio delle righe e comunque una lettura della memoria non è poi così costosa.Se invece leggere quell'immobile fosse un'operazione molto costosa, vedresti una differenza più evidente.

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