Nhiều câu trả lời trong số này đưa ra lý do hợp lệ cho lý do tại sao C là, hoặc không, nhanh hơn (nói chung hoặc trong các tình huống cụ thể). Không thể phủ nhận rằng:
- Nhiều ngôn ngữ khác cung cấp các tính năng tự động mà chúng tôi được cấp. Ví dụ, kiểm tra giới hạn, kiểm tra loại thời gian chạy và quản lý bộ nhớ tự động, không đến miễn phí. Có ít nhất một số chi phí liên quan đến các tính năng này, điều mà chúng ta có thể không nghĩ về, hoặc thậm chí là nhận ra trong khi viết mã sử dụng các tính năng này.
- Bước từ nguồn đến máy thường không trực tiếp bằng các ngôn ngữ khác như trong C.
- OTOH, để nói rằng mã C được biên dịch thực thi nhanh hơn các mã khác được viết bằng các ngôn ngữ khác là một khái quát không phải lúc nào cũng đúng. Các ví dụ dễ tìm thấy (hoặc contrive).
Mặc dù vậy, có một điều khác tôi nhận thấy rằng, tôi nghĩ, ảnh hưởng đến hiệu suất so sánh của C so với nhiều ngôn ngữ khác nhiều hơn bất kỳ yếu tố nào khác. Để dí dỏm:
Các ngôn ngữ khác thường làm cho việc viết mã thực thi chậm hơn. Thông thường, nó thậm chí còn được khuyến khích bởi các triết lý thiết kế của ngôn ngữ. Hệ quả: một lập trình viên C có nhiều khả năng viết mã không thực hiện các hoạt động không cần thiết.
Ví dụ, hãy xem xét một chương trình Windows đơn giản trong đó một cửa sổ chính duy nhất được tạo. Phiên bản AC sẽ tạo ra một WNDCLASS[EX]
cấu trúc sẽ được chuyển đến RegisterClass[Ex]
, sau đó gọi CreateWindow[Ex]
và nhập một vòng lặp tin nhắn. Mã đơn giản và viết tắt cao như sau:
WNDCLASS wc;
MSG msg;
wc.style = 0;
wc.lpfnWndProc = &WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = "MainWndCls";
RegisterClass(&wc);
CreateWindow("MainWndCls", "", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
while(GetMessage(&msg, NULL, 0, 0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Một chương trình tương đương trong C # có thể chỉ là một dòng mã:
Application.Run(new Form());
Một dòng mã này cung cấp tất cả các chức năng mà gần 20 dòng mã C đã làm và thêm một số thứ chúng tôi bỏ qua, chẳng hạn như kiểm tra lỗi. Thư viện phong phú hơn, đầy đủ hơn (so với những thư viện được sử dụng trong một dự án C điển hình) đã làm rất nhiều việc cho chúng tôi, giải phóng thời gian của chúng tôi để viết nhiều đoạn mã ngắn hơn cho chúng tôi nhưng liên quan đến nhiều bước phía sau hậu trường.
Nhưng một thư viện phong phú cho phép phình mã dễ dàng và nhanh chóng không thực sự là quan điểm của tôi. Quan điểm của tôi rõ ràng hơn khi bạn bắt đầu kiểm tra những gì thực sự xảy ra khi một lớp lót nhỏ của chúng tôi thực sự thực thi. Để giải trí, đôi khi, cho phép truy cập nguồn .NET trong Visual Studio 2008 trở lên và bước vào một dòng đơn giản ở trên. Một trong những viên ngọc nhỏ thú vị mà bạn sẽ bắt gặp là nhận xét này trong getter cho Control.CreateParams
:
// In a typical control this is accessed ten times to create and show a control.
// It is a net memory savings, then, to maintain a copy on control.
//
if (createParams == null) {
createParams = new CreateParams();
}
Mười lần . Thông tin gần tương đương với tổng của những gì được lưu trữ trong một WNDCLASSEX
cấu trúc và những gì được truyền đến CreateWindowEx
được lấy từ Control
lớp mười lần trước khi nó được lưu trữ trong một WNDCLASSEX
cấu trúc và được truyền cho RegisterClassEx
vàCreateWindowEx
.
Nói chung, số lượng lệnh được thực thi để thực hiện nhiệm vụ rất cơ bản này là 2 lệnh3 độ lớn hơn trong C # so với C. Một phần của điều này là do việc sử dụng thư viện giàu tính năng, nhất thiết phải được khái quát hóa, so với mã C đơn giản của chúng tôi thực hiện chính xác những gì chúng tôi cần và không có gì hơn. Nhưng một phần của nó là do bản chất được mô đun hóa, hướng đối tượng của .NET framework, cho vay rất nhiều sự lặp lại của việc thực thi thường bị tránh bởi một cách tiếp cận theo thủ tục.
Tôi không cố gắng chọn C # hoặc .NET framework. Tôi cũng không nói rằng mô đun hóa, khái quát hóa, các tính năng thư viện / ngôn ngữ, OOP, vv là những điều xấu . Tôi đã từng thực hiện hầu hết sự phát triển của mình trong C, sau đó là C ++ và gần đây nhất là C #. Tương tự, trước C, tôi đã sử dụng phần lớn là lắp ráp. Và với mỗi bước "cao hơn" ngôn ngữ của tôi đi, tôi viết các chương trình tốt hơn, dễ bảo trì hơn, mạnh mẽ hơn trong thời gian ngắn hơn. Họ làm, tuy nhiên, có xu hướng thực hiện chậm hơn một chút.