Sapevo già che l'impostazione di un campo è molto più lenta dell'impostazione di una variabile locale, ma sembra anche che l'impostazione di un campo con una variabile locale sia molto più lenta rispetto all'impostazione di una variabile locale con un campo. Perchè è questo? In entrambi i casi viene utilizzato l'indirizzo del campo.Perché impostare un campo molto più lentamente di ottenere un campo?
public class Test
{
public int A = 0;
public int B = 4;
public void Method1() // Set local with field
{
int a = A;
for (int i = 0; i < 100; i++)
{
a += B;
}
A = a;
}
public void Method2() // Set field with local
{
int b = B;
for (int i = 0; i < 100; i++)
{
A += b;
}
}
}
I risultati benchmark con 10e + 6 iterazioni sono:
Method1: 28.1321 ms Method2: 162.4528 ms
Dipende da un sacco di cose, ma la spiegazione più ovvia è che ottenere non deve accedere a DRAM (il valore nella cache della CPU), mentre l'impostazione fa (cache write-through ... cioè il valore viene scritto sia nella cache che nella memoria di sistema). Si noti che l'impostazione di una variabile locale potrebbe non consentire alcun accesso alla memoria, poiché il compilatore potrebbe aver ottimizzato la variabile locale in un registro. –
@PeterDuniho - Pensavo che solo i locali fossero idonei per il caching della CPU? – toplel32
Come ho accennato nel mio commento, i locali spesso non sono nemmeno memorizzati nella RAM di sistema. Tuttavia, l'accesso alla memoria, indipendentemente dal tipo di variabile, è idoneo per la memorizzazione nella cache. La cache non si cura (o nemmeno sa) del perché si stia utilizzando uno specifico indirizzo di memoria; memorizza tutti i dati che è in grado di memorizzare quando è coinvolta la memoria di sistema. –