Hy vọng đây là một bài đăng hợp lệ ở đây, đó là sự kết hợp của các vấn đề và phần cứng C#.Hiệu suất C# khác nhau do bộ nhớ
Tôi đang đánh giá máy chủ của mình vì chúng tôi đã tìm thấy vấn đề với hiệu suất của thư viện lượng tử của chúng tôi (được viết bằng C#). Tôi đã mô phỏng các vấn đề hiệu suất tương tự với một số mã C# đơn giản - thực hiện việc sử dụng bộ nhớ rất nặng.
Mã bên dưới là một hàm được sinh ra từ một luồng, tối đa 32 luồng (vì máy chủ của chúng tôi có 4 nhân CPU x 8 lõi).
Đây là tất cả trên Net 3.5
Vấn đề là chúng ta đang nhận được một cách hoang dại khác nhau thực hiện. Tôi chạy hàm dưới 1000 lần. Thời gian trung bình lấy để chạy mã có thể là 3,5 giây, nhưng tốc độ nhanh nhất sẽ chỉ là 1,2 giây và chậm nhất sẽ là 7 giây cho cùng một hàm chính xác!
Tôi đã vẽ đồ thị sử dụng bộ nhớ so với timings và có doesnt dường như bất kỳ mối tương quan với các GC đá trong.
Một điều tôi đã thông báo là khi đang chạy trong một chủ đề duy nhất timings là giống hệt nhau và có không có độ lệch hoang dã. Tôi cũng đã thử nghiệm các thuật toán liên kết CPU và thời gian cũng giống nhau. Điều này đã làm cho chúng tôi tự hỏi nếu xe buýt bộ nhớ chỉ không thể đối phó.
Tôi băn khoăn rằng đây có phải là vấn đề khác .net hoặc C# hay liên quan đến phần cứng của chúng tôi? Đây có phải là trải nghiệm tương tự nếu tôi đã sử dụng C++ hoặc Java ?? Chúng tôi đang sử dụng 4x Intel x7550 với ram 32GB. Có cách nào xung quanh vấn đề này nói chung không?
Stopwatch watch = new Stopwatch();
watch.Start();
List<byte> list1 = new List<byte>();
List<byte> list2 = new List<byte>();
List<byte> list3 = new List<byte>();
int Size1 = 10000000;
int Size2 = 2 * Size1;
int Size3 = Size1;
for (int i = 0; i < Size1; i++)
{
list1.Add(57);
}
for (int i = 0; i < Size2; i = i + 2)
{
list2.Add(56);
}
for (int i = 0; i < Size3; i++)
{
byte temp = list1.ElementAt(i);
byte temp2 = list2.ElementAt(i);
list3.Add(temp);
list2[i] = temp;
list1[i] = temp2;
}
watch.Stop();
(mã là chỉ có nghĩa là để nhấn mạnh ra bộ nhớ)
tôi sẽ bao gồm mã threadpool, nhưng chúng tôi sử dụng một thư viện threadpool phi tiêu chuẩn.
EDIT: Tôi đã giảm "size1" xuống 100000, về cơ bản không sử dụng nhiều bộ nhớ và tôi vẫn nhận được rất nhiều jitter. Điều này cho thấy nó không phải là số lượng bộ nhớ được chuyển giao, nhưng tần số của bộ nhớ lấy?
Có bất kỳ quy trình nào khác đang chạy trong điểm chuẩn của bạn không? Ngay cả hệ điều hành cũng cần thời gian CPU. Nếu bạn đang sử dụng tất cả các lõi ảo trong quá trình benchmark của mình, bạn hầu như không thể đảm bảo rằng các quá trình không liên quan sẽ mất thời gian CPU trong quá trình kiểm tra của bạn. –
Chúng tôi không có đủ thông tin để làm bất cứ điều gì nhưng suy đoán. Điều đó nói rằng, tiền của tôi là trên "thư viện threadpool không chuẩn của bạn" không phân bổ đủ luồng để chạy song song. Nếu bạn chạy 50 bản sao và bạn chỉ phân bổ 20 chủ đề (ví dụ), 10 lần lặp lại sẽ phải đợi (trung bình) cho 2 lần lặp khác để hoàn thành cho một chuỗi để giải phóng. Điều đó có thể giải thích cho những sai lệch mà bạn đang thấy. –
Chỉ cần một ý tưởng: Vì bạn xuất hiện để biết kích thước của danh sách, bạn nên truyền nó cho hàm tạo (hoặc chỉ sử dụng mảng). Sau đó, bạn tránh việc phân bổ lại nếu các mảng bên dưới. –