2012-08-16 17 views
7

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?

+0

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ự ở đó. –

+0

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

+0

@harold Kể từ khi nào? –

Trả lời

3

đ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?

Bạn có hỏi thực tế có một cuộc họp bí mật vào tháng trước giữa Microsoft và Xamarin hay không, trong khi cả hai đã dành cả thập kỷ qua để cải thiện người chơi tương ứng, làm cho mọi thứ tốt hơn, và sẽ không bận tâm nữa, và MS sẽ tái chỉ định tất cả mọi người trong khi Xamarin sẽ từ chối bất kỳ bản vá được gửi để cải thiện jitter?

Tôi muốn nói rằng điều này là không thể, và giống như mọi dự án phần mềm được phát triển tích cực khác trên thế giới, có những kế hoạch để cải thiện nó.

Bên cạnh đó, nếu tôi thực sự muốn chạy mã bạn đã cung cấp càng nhanh càng tốt, tôi sẽ tối ưu hóa nó thành return 161315136;. Mã như vậy có thể chứng minh rằng việc thực hiện A chậm hơn so với triển khai B trong một trường hợp cụ thể, nhưng không nói gì về nơi mà những người đứng đằng sau một trong hai triển khai nên tập trung nỗ lực của họ.

+0

Mã này là để chứng minh rằng C# jitter là để đổ lỗi cho C# là chậm hơn so với C + +, không chỉ "quản lý trên không" mà rất nhiều người dân (bao gồm cả Herb Sutter) đề cập đến. Rõ ràng có nhiều hơn nữa để thực hiện hơn so với các hoạt động và các nhánh số nguyên đơn giản. – kaalus

+0

Vâng, nhưng ngoài kết quả @HansPassant đã nhận được với nó, có câu hỏi về mức độ liên quan của nó. Đây có phải là trường hợp cần thiết cho các đội jitter đặt nỗ lực của họ vào? Và nếu họ đã làm, nó sẽ là đủ thú vị cho bất kỳ người trong số họ để viết về? Tôi tưởng tượng nó sẽ đi theo "và chúng tôi đã làm một vài cải tiến khác" dòng bạn nhận được trong bài viết về vấn đề như vậy, hơn là của họ là một loạt các bài đăng blog về phép nhân trong một vòng lặp được thực hiện nhanh hơn. –

+0

Tôi nghĩ rằng có những lợi ích đáng kể được thực hiện bằng cách cải thiện C# jitter. Tôi muốn xem C# match hoặc vượt qua Java trong The Computer Language Benchmarks Game (http://shootout.alioth.debian.org). C# có các kiểu giá trị gốc và nó thực sự là một sự xấu hổ rằng Java là khá nhanh hơn rất nhiều thời gian. Mặc dù họ thử nghiệm với Mono, không phải thực hiện MS ở đó. – kaalus

9

phát hành xây dựng, VS2008SP1, NET 3.5SP1, trung bình 10 xét nghiệm:

.NET, x86: 2.646 seconds 
C++, x86: 2.652 seconds 
.NET, x64: 2.352 seconds 
C++, x64: 2.090 seconds 

sai lầm cổ điển được giả định rằng/o rất có ý nghĩa, đo thời gian jitting, chạy debug xây dựng, thử nghiệm với trình gỡ lỗi kèm theo do đó trình tối ưu hóa jitter bị tắt.

Các x64 jitter sử dụng thủ thuật tương tự như bạn đã đề cập, nó không phải là duy nhất để mã máy phát điện C++:

00000030 xor   r9d,r9d 
... 
00000059 add   r9d,7 

Một tính năng mới cho .NET 4.5 là sơ Tối ưu hóa hướng dẫn.

Các kế hoạch trong tương lai không bao giờ được chia sẻ bởi một công ty như Microsoft và không có điểm nào để đoán chúng.

+0

Đây phải là câu trả lời được chấp nhận. – hoodaticus

Các vấn đề liên quan