Ich wusste bereits, dass das Setzen eines Feldes viel langsamer ist als das Setzen einer lokalen Variablen, aber es scheint auch, dass das Setzen eines Feldes mit eine lokale Variable ist viel langsamer als das Setzen einer lokalen Variablen mit einem Feld. Warum ist das? In jedem Fall wird die Adresse des Feldes verwendet.Warum wird ein Feld viel langsamer eingestellt als ein Feld?
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;
}
}
}
Die Benchmark-Ergebnisse mit 10e + 6 Iterationen sind:
Method1: 28.1321 ms Method2: 162.4528 ms
Es hängt von vielen Dingen ab, aber die offensichtlichste Erklärung ist, dass man nicht auf DRAM zugreifen muss (der Wert ist im CPU-Cache)), während setting (cache write-through ... dh der Wert wird sowohl in den Cache als auch in den Systemspeicher geschrieben). Beachten Sie, dass das Setzen einer lokalen Variablen möglicherweise zu keinem Speicherzugriff führt, da der Compiler die lokale Variable möglicherweise in einem Register optimiert hat. –
@PeterDuniho - Ich dachte, nur Einheimische könnten CPU-Caching durchführen? – toplel32
Wie ich in meinem Kommentar erwähne, sind Einheimische oft nicht einmal im System-RAM gespeichert. Aber _all_ Speicherzugriff, unabhängig vom Typ der Variablen, ist für Caching geeignet. Der Cache interessiert nicht (oder weiß nicht), warum Sie eine bestimmte Speicheradresse verwenden. Es speichert alle möglichen Daten im Systemspeicher. –