2009-03-01 38 views
10

Tôi nhận thấy trên cùng một máy, phải mất C# ít hơn nhiều so với C++ để biên dịch. Tại sao?Tại sao C# biên dịch nhanh hơn nhiều so với C++?

NOTE1: Tôi chưa thực hiện bất kỳ điểm chuẩn khoa học nào.

CHÚ Ý2: Trước khi bất kỳ ai nói điều này không liên quan đến lập trình, tôi đang triển khai trình phân tích cú pháp, tôi đang tìm kiếm những gì tôi có thể làm để bắt đầu tăng tốc độ biên dịch.

NOTE3: Tôi có câu hỏi tương tự Why do compilations take so long?. Câu hỏi này đặt ra sự khác biệt cụ thể từ C/C++ đến C#. Rõ ràng là một ngôn ngữ đơn giản sẽ nhanh hơn để biên dịch hơn một ngôn ngữ phức tạp, nhưng C và C# là cả hai ngôn ngữ phức tạp.

takeaway của tôi: 1) C/C++ là SLOW từ tiền xử lý và tiêu đề. 2) nhiều tiêu đề gây ra nhiều dữ liệu hơn để phân tích cú pháp. đặc biệt là khi mỗi tập tin có thể sử dụng tiền xử lý có thể thay đổi mã 3) C# hoãn một số biên soạn chương trình khởi động 4) hướng dẫn IL rất đơn giản, máy không phải là

+0

Tôi phải tự hỏi bạn có đọc câu trả lời cho câu hỏi trước của bạn về chủ đề này không: http://stackoverflow.com/questions/588884/why-do-compilations-take-so-long –

+0

vâng tôi có. Câu hỏi này tập trung vào sự khác biệt cụ thể từ c đến C# –

+0

những điều được gọi cụ thể trong câu trả lời đó ... đó là những điều C++ làm điều đó tạo nên sự khác biệt, không có gì đặc biệt mà C# không – ShuggyCoUk

Trả lời

2

Bởi vì C++ biên dịch để mã máy, trong khi mã C# thành byte. Bạn có nhận thấy sự chậm trễ khi bạn khởi động chương trình .NET lần đầu tiên. Đó là khi mã byte được JIT (được biên dịch thành mã máy).

+0

Có rất nhiều câu hỏi này hơn mặc dù. –

+1

Delphi cũng biên dịch thành mã máy, và nó nhanh hơn C#. – Arafangion

+1

vấn đề chính là nguồn, không phải là mục tiêu. – peterchen

0

Tôi nghĩ rằng đó có thể là do AMOUNT phân tích cú pháp phải làm, thay vì tốc độ của trình phân tích cú pháp.

C++ thường sử dụng bộ tiền xử lý C, kéo nhiều tệp bao gồm (như những người khác đã đề xuất và câu hỏi khác chứa nhiều câu trả lời như nó). Điều này làm nổi bật số lượng mã để phân tích cú pháp.

Vì vậy, nếu bạn đang so sánh chúng cho các mục đích của việc viết một phân tích cú pháp ... biết rằng bạn không nên có .h kiểu bao gồm các file :)

5

Có hai vấn đề riêng biệt để xem xét - số pha xử lý và độ phức tạp của nhắm mục tiêu. Một biên dịch C++ điển hình bao gồm một số giai đoạn (mặc dù chúng có thể chạy đồng thời), nơi Preprocessor xử lý các chỉ thị và macro, thì trình biên dịch C++ tự xử lý mã kết quả. Nó khá phổ biến đối với bộ tiền xử lý để tạo ra đầu ra lớn hơn đáng kể, mã mà tất cả mọi thứ cần được phân tích và xử lý bởi trình biên dịch thực tế. Ngoài ra, hãy nhớ rằng trình biên dịch C++ sẽ nhắm đến ngôn ngữ máy x86 hoặc x64 - xử lý mọi tối ưu hóa ở phía trước và cố gắng tận dụng tối đa phần cứng không thực sự được tối ưu hóa trong phát triển kiểu OO.

Ngược lại, trình biên dịch C# đang nhắm mục tiêu Microsoft Intermediate Language (MSIL), một nền tảng giống như mã máy cao hơn được thiết kế để sử dụng cho phát triển OO. Nhiều cấu trúc được cung cấp bởi C# map trực tiếp vào các lệnh IL, giúp việc biên dịch trở nên dễ dàng. Một chunck công bằng của tối ưu hóa và hoạt động khác được hoãn lại cho đến khi khởi động chương trình thực tế, tại thời điểm đó nó được tối ưu hóa cho máy chính xác có sẵn.

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