Tôi đã biết rằng thiết lập một trường chậm hơn nhiều so với thiết lập một biến địa phương, nhưng nó cũng xuất hiện rằng thiết lập một trường với biến cục bộ chậm hơn nhiều so với thiết lập biến cục bộ với một trường. Tại sao điều này? Trong cả hai trường hợp, địa chỉ của trường được sử dụng.Tại sao thiết lập một trường nhiều lần chậm hơn so với nhận được một trường?
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;
}
}
}
Kết quả benchmark với 10e + 6 lần lặp là:
Method1: 28.1321 ms Method2: 162.4528 ms
Nó phụ thuộc vào rất nhiều thứ, nhưng giải thích rõ ràng nhất là không cần phải truy cập DRAM (giá trị trong bộ đệm CPU), trong khi thiết lập không (ghi đè bộ nhớ cache ... tức là giá trị được ghi vào cả bộ nhớ cache và bộ nhớ hệ thống). Lưu ý rằng việc thiết lập một biến cục bộ có thể dẫn đến không có truy cập bộ nhớ nào cả, vì trình biên dịch có thể đã tối ưu hóa biến cục bộ thành một thanh ghi. –
@PeterDuniho - Tôi nghĩ chỉ có người dân địa phương mới đủ điều kiện cho bộ đệm CPU? – toplel32
Như tôi đã đề cập trong nhận xét của tôi, người dân địa phương thường không được lưu trữ trong RAM hệ thống. Nhưng truy cập bộ nhớ _all_, bất kể loại biến, có đủ điều kiện để lưu vào bộ nhớ đệm hay không. Bộ nhớ cache không quan tâm (hoặc thậm chí biết) tại sao bạn đang sử dụng một địa chỉ bộ nhớ cụ thể; nó lưu trữ bất kỳ và tất cả dữ liệu mà nó có thể khi bộ nhớ hệ thống được tham gia. –