Tôi đang cố gắng tìm hiểu về hiệu suất bộ nhớ cache CPU trong thế giới .NET. Cụ thể là tôi đang làm việc qua số article about Processor Cache Effects của Igor Ostovsky.Hiệu suất khi tạo CPU Cache Misses
Tôi đã trải qua ba ví dụ đầu tiên trong bài viết của mình và đã ghi lại các kết quả có sự khác biệt lớn với anh ấy. Tôi nghĩ rằng tôi phải làm điều gì đó sai vì hiệu suất trên máy tính của tôi cho thấy hầu hết các kết quả ngược lại chính xác của những gì anh ấy thể hiện trong bài viết của mình. Tôi không thấy những hiệu ứng lớn từ bộ nhớ cache mà tôi mong đợi.
Tôi đang làm gì sai? (Mã xấu, thiết lập trình biên dịch, vv)
Dưới đây là kết quả thực hiện trên máy tính của tôi:
Nếu nó giúp, bộ vi xử lý trên của tôi máy là một Intel Core i7-2630QM. Dưới đây là thông tin về bộ nhớ cache bộ xử lý của tôi:
tôi đã biên soạn trong chế độ x64 phát hành.
Dưới đây là mã nguồn của tôi:
class Program
{
static Stopwatch watch = new Stopwatch();
static int[] arr = new int[64 * 1024 * 1024];
static void Main(string[] args)
{
Example1();
Example2();
Example3();
Console.ReadLine();
}
static void Example1()
{
Console.WriteLine("Example 1:");
// Loop 1
watch.Restart();
for (int i = 0; i < arr.Length; i++) arr[i] *= 3;
watch.Stop();
Console.WriteLine(" Loop 1: " + watch.ElapsedMilliseconds.ToString() + " ms");
// Loop 2
watch.Restart();
for (int i = 0; i < arr.Length; i += 32) arr[i] *= 3;
watch.Stop();
Console.WriteLine(" Loop 2: " + watch.ElapsedMilliseconds.ToString() + " ms");
Console.WriteLine();
}
static void Example2()
{
Console.WriteLine("Example 2:");
for (int k = 1; k <= 1024; k *= 2)
{
watch.Restart();
for (int i = 0; i < arr.Length; i += k) arr[i] *= 3;
watch.Stop();
Console.WriteLine(" K = "+ k + ": " + watch.ElapsedMilliseconds.ToString() + " ms");
}
Console.WriteLine();
}
static void Example3()
{
Console.WriteLine("Example 3:");
for (int k = 1; k <= 1024*1024; k *= 2)
{
//256* 4bytes per 32 bit int * k = k Kilobytes
arr = new int[256*k];
int steps = 64 * 1024 * 1024; // Arbitrary number of steps
int lengthMod = arr.Length - 1;
watch.Restart();
for (int i = 0; i < steps; i++)
{
arr[(i * 16) & lengthMod]++; // (x & lengthMod) is equal to (x % arr.Length)
}
watch.Stop();
Console.WriteLine(" Array size = " + arr.Length * 4 + " bytes: " + (int)(watch.Elapsed.TotalMilliseconds * 1000000.0/arr.Length) + " nanoseconds per element");
}
Console.WriteLine();
}
}
Bạn đang sử dụng CPU nào? Bộ nhớ cache có bao nhiêu bộ nhớ cache? Cấp 1 và 2? – Oded
Đây là Intel Core i7-2630QM. Số liệu thống kê bộ nhớ cache nằm trong hình ảnh dòng lệnh ở trên. –
Ngoài ra, bạn có đủ RAM trong hệ thống? Bạn không đập vào trang tệp trong khi thử nghiệm? –