Tôi nhận thấy rằng trình tạo mã C# tạo ra mã chậm hơn so với trình biên dịch C++, ngay cả khi không có cấu trúc "quản lý trên đầu" được sử dụng (chẳng hạn như các mảng có đánh chỉ mục đã chọn).C# jitter cải tiến trong các phiên bản framework tương lai
Để lượng hóa nó, tôi timed vòng lặp sau đây đơn giản:
public static int count = 1000000000;
public static int Main()
{
int j = 0;
for (int i = 0; i < count; ++i)
{
j += (i % 2 == 0) ? ((i + 7) >> 3) : (i * 7);
}
return j;
}
vòng lặp này có 3.88s để thực hiện (biên soạn với/o). Vòng lặp tương đương được biên dịch với VC 2010 (-O2) mất 2,95 giây.
Để xác minh rằng mã kém thực sự được tạo, tôi đã so sánh mã máy: tạo danh sách (/ FA) từ trình biên dịch VC và đính kèm trình gỡ lỗi vào chương trình C# (sau khi kết thúc vòng lặp).
Thật vậy, phiên bản C++ đang sử dụng một số thủ thuật thông minh. Ví dụ để tránh phép nhân tốn kém bằng 7, có một thanh ghi riêng biệt được tăng lên 7 mỗi lần đếm vòng lặp. C# phiên bản hiện nhân (imul) mỗi lần. Có những khác biệt khác nữa.
Tôi hiểu rằng C# jitter có ít thời gian hơn nhiều để biên dịch mã trong thời gian chạy hơn VC tại thời gian xây dựng. Nhưng ví dụ: Java jitter là tự động tối ưu hóa các phương pháp thường được sử dụng. C# dường như không làm điều đó.
Câu hỏi của tôi là: đang có kế hoạch cải thiện trình khởi chạy C# trong các phiên bản khuôn khổ trong tương lai không?
Visual Studio RC 2012 với .NET 4.5 có sẵn để tải xuống kể từ hôm qua. Tải xuống (miễn phí) và chạy thử nghiệm tương tự ở đó. –
Tôi đã ngừng giữ hơi thở của mình để tối ưu hóa mới được thực hiện bởi jitter một thời gian dài trước đây. MS dường như nghĩ rằng nó đủ tốt trong bộ phận đó. – harold
@harold Kể từ khi nào? –