C có nhanh hơn đáng kể so với C ++ không [đóng]


82

Theo như tôi hiểu tất cả các ngôn ngữ kịch bản và các chương trình khoa học cốt lõi thường được viết bằng C; điều này làm cho việc triển khai trở nên lộn xộn nhưng theo cách đi thẳng vào vấn đề.

Tôi hiểu những người này muốn tối đa hiệu suất của họ nhưng có sự khác biệt thực sự giữa việc sử dụng chuỗi C và cấu trúc C với việc sử dụng các lớp C ++; C ++ dường như hoạt động theo cùng một cách, ngoài các hàm ảo, nó lưu trữ một hàm lớp một lần và mọi cá thể của lớp đó đều gọi một hàm đó.

Điều gì làm cho C nhanh hơn và nó có phải là một sự khác biệt đáng chú ý trong một dự án như python hoặc sqlite phải nhanh nhất không?


8
"Bạn chỉ nên hỏi những câu hỏi thực tế, có thể trả lời được dựa trên những vấn đề thực tế mà bạn phải đối mặt." - Câu hỏi thường gặp về stackoverflow.
RedGrittyBrick

4
@Will - Không. "Là một ngôn ngữ nhanh hơn một ngôn ngữ khác" là không thể trả lời được. Ngôn ngữ không nhanh, chỉ có cách triển khai. "Việc triển khai X của một ngôn ngữ có nhanh hơn việc triển khai Y của một ngôn ngữ khác không?" có thể trả lời bằng cách lập hồ sơ, nhưng bạn lập hồ sơ để làm gì? Việc tiếp thu ngôn ngữ có thể nhanh hoặc chậm trong nhiều lĩnh vực khác nhau và việc kiểm tra tất cả chúng chắc chắn là không thể. Một câu hỏi hay hơn sẽ là "Tại sao các nhà thiết kế ngôn ngữ lại chọn ngôn ngữ X thay vì ngôn ngữ Y?" Điều đó có câu trả lời rõ ràng (các lý do được đưa ra bởi các nhà thiết kế ngôn ngữ khác nhau) và có nhiều khả năng hữu ích.
Chris Lutz

3
Cùng một đoạn mã trong C và C ++ thường nên chạy với tốc độ chính xác như nhau, ngoại lệ là mã có ngữ nghĩa khác nhau do các quy tắc răng cưa khác nhau, v.v. Sự khác biệt là giữa thành ngữ C và thành ngữ C ++. Nếu bạn viết mã bằng các thành ngữ C thực hành tốt nhất bằng C hoặc C ++, nó thường sẽ nhẹ hơn và nhanh hơn nhiều (và có ít trường hợp lỗi để xử lý hơn) so với chức năng tương tự được viết bằng các thành ngữ C ++ thực hành tốt nhất (bất kể bạn có viết nó hay không bằng C hoặc C ++), nhưng có thể bạn sẽ mất nhiều công sức hơn để viết.
R .. GitHub DỪNG TRỢ GIÚP LÚC NỮA,

7
C là đáng chú ý nhanh hơn để học một cách trọn vẹn hơn so với C ++;)
fredoverflow

2
@Gracchus Chúng ta đang nói về hai điều khác nhau ở đây. Hoàn thành các tác vụ thông thường dễ dàng hơn rất nhiều trong C ++ nhờ các vùng chứa tiêu chuẩn và RAII và những thứ khác. Tôi chỉ nói rằng bản thân ngôn ngữ này lớn hơn rất nhiều so với C. Nếu mục tiêu của bạn là học C ++ toàn bộ đến mức bạn có thể sử dụng các chương trình C ++ tùy ý do người khác viết và hiểu chúng, thì phải mất vài năm (khoảng 10 theo nhiều) của việc học C ++. Mặt khác, học hỏi tất cả những phức tạp của C có thể mất một vài tuần hoặc vài tháng ngọn, bởi vì đơn giản là không phải là phức tạp ngôn ngữ nhiều trong C.
fredoverflow

Câu trả lời:


63

C ++ thường được sử dụng cho các chương trình khoa học. Sự phổ biến của C có thể đang suy yếu trong lĩnh vực đó. Fortran vẫn phổ biến như một ngôn ngữ "cấp thấp".

Trong C ++, "bạn chỉ trả tiền cho những gì bạn sử dụng." Vì vậy, không có gì làm cho nó chậm hơn C. Đặc biệt đối với các chương trình khoa học, các mẫu biểu thức giúp bạn có thể thực hiện một số tối ưu hóa tùy chỉnh bằng cách sử dụng công cụ mẫu để xử lý ngữ nghĩa của chương trình.

Lý do C được chọn cho các dự án như Python là nhiều người hiểu nó (tương đối) đầy đủ, vì vậy một cơ sở mã lớn sẽ không làm nhiều người trong số nhiều người đóng góp nhầm lẫn.

SQLite có yêu cầu về kích thước mã thực thi nhỏ, trong đó C có một chút lợi thế. Việc sử dụng C ++ một cách thận trọng vẫn cho phép sử dụng trong các ứng dụng nhúng, nhưng nó ít phổ biến hơn do sợ rằng các tính năng ngôn ngữ không mong muốn sẽ xâm nhập vào.


9
Xin lưu ý rằng C ++ không đặt tên mangling, trong khi C thì không, điều này giúp các ngôn ngữ khác giao tiếp trực tiếp với C dễ dàng hơn. (uống một lân thực sự xây dựng một giao diện C đến C ++ mã cho bạn trước khi tạo wrapper python vào thư viện C ++.)
Sam P

7
@SamP C ++ có tính năng vô hiệu hóa việc xáo trộn tên extern "C",. Swig tình cờ sử dụng C như một ngôn ngữ, nhưng bạn có thể triển khai trình bao bọc đó trong tập con tương thích với C của C ++ và không bao giờ gọi trình biên dịch C.
Potatoswatter

26

Tôi không nghĩ rằng lý do liên quan nhiều đến hiệu suất cũng như khả năng tương tác. Ngôn ngữ C ++ phức tạp hơn ngôn ngữ C, nhưng từ quan điểm hiệu suất sẽ không có sự khác biệt đáng chú ý theo cả hai cách. Một số cấu trúc C ++ nhanh hơn cấu trúc C tương đương ( std::sortnhanh hơn qsort) và có lẽ có những ví dụ điển hình về cách khác.

CHỈNH SỬA: Về mặt khả năng tương tác ...

Về cơ bản, tiêu chuẩn C ++ không xác định một số thứ có thể cần thiết để dễ dàng tương tác giữa các tệp nhị phân được tạo bằng các trình biên dịch / phiên bản khác nhau. Vấn đề đáng chú ý nhất ở đây là quy ước đặt tên cho các ký hiệu trong hệ nhị phân. Trong C, ngôn ngữ xác định một ánh xạ duy nhất từ ​​mỗi ký hiệu trong mã sang tên ký hiệu nhị phân. Một hàm được gọi my_functionsẽ tạo ra một ký hiệu trong hệ nhị phân được gọi my_function. Mặt khác, và do tính năng như chức năng quá tải, tên của chức năng C ++ phải được đọc sai(được dịch thành các ký hiệu hàm khác nhau trong hệ nhị phân, mã hóa kiểu đối số và kiểu trả về) và tiêu chuẩn không xác định cách thực hiện thao tác đọc. Điều đó có nghĩa là cùng một hàm trong C ++ có thể được biên dịch thành các ký hiệu khác nhau tùy thuộc vào trình biên dịch (trừ khi extern "C"được sử dụng để buộc khả năng tương tác của C cho các hàm đó trong C ++).

Vào cuối ngày, giao diện giữa ngôn ngữ kịch bản và mã gốc dù sao cũng phải là giao diện C, ngay cả khi chi tiết về cách nó được triển khai nội bộ có thể là C / C ++ / bất kỳ ngôn ngữ mẹ đẻ nào khác.

(Tôi cố ý không muốn tham gia vào một cuộc chiến ngôn ngữ nảy lửa, C ++ thực sự mạnh mẽ, nhưng nó cũng hơi đáng sợ vì nó là một ngôn ngữ phức tạp hơn nhiều so với C và một số thứ trông đơn giản có thể ảnh hưởng đến hiệu suất)


1
Tôi nghĩ người ta có thể tự tin nói rằng C ++ hiện đại, thành ngữ yêu cầu một trình biên dịch thông minh để tận dụng tối đa tính năng nội tuyến, RVO, gấp liên tục, v.v. Với điều đó, hoàn toàn có thể là các cấu trúc C ++ nặng nề không đáng chú ý chút nào. mức máy, nhưng một trình biên dịch tốt là quan trọng hơn nhiều cho C ++ so với C.
Kerrek SB

@Kerrek SB: Hầu hết các trình biên dịch C ++ hiện đại (trong đó hiện đại có nghĩa là vài năm trở lại đây) thực sự giỏi trong việc xác định các cấu trúc C ++ thành ngữ và tối ưu hóa. Đây std::sortlà một ví dụ như vậy: std::lesshàm chức năng được sử dụng theo mặc định không kém hiệu quả hơn hàm C tương đương, nhưng tất cả các trình biên dịch mà tôi biết sẽ nội dòng nó (là một mẫu có sẵn để nội tuyến) và loại bỏ tất cả các lệnh gọi hàm đến hàm chức năng compare.
David Rodríguez - dribeas

Thật thú vị, thư viện EASTL của Electronic Arts được biện minh một phần bởi tuyên bố rằng họ nhận thấy GCC là nội tuyến kém (và MSVC tốt hơn nhiều) và do đó thư viện tiêu chuẩn sẽ phải chịu quá nhiều lệnh gọi hàm chưa được tối ưu hóa. Trong EASTL, họ sử dụng ít chuyển hướng hơn để chống lại điều này. Ai biết được lý do đó ngày nay được duy trì tốt như thế nào.
Kerrek SB

12

Như Bjarne đã đề cập trong [D&E], hiệu quả là một trong những mục tiêu chính của C ++. Vì vậy, C ++ chỉ chậm hơn khi lập trình viên sử dụng các chức năng "bổ sung" của nó như các chức năng ảo mà bạn đã đề cập, thông tin rtt, v.v.

Vì vậy, tôi nghĩ đó là lý do tâm lý nhiều hơn - C được sử dụng vì nó không cho phép các tính năng C ++ "chậm".


9

Ngôn ngữ vốn dĩ không nhanh hơn hay chậm hơn, trình thông dịch và trình biên dịch có thể hiệu quả hơn hoặc kém hơn.

Bên cạnh đó, các ngôn ngữ cấp cao hơn cung cấp các lớp trừu tượng thường có chi phí thời gian chạy. Nếu bạn không sử dụng chúng, trình biên dịch có thể đủ thông minh để loại bỏ chúng, nhưng điều đó có thể không khả thi nếu ngữ nghĩa của ngôn ngữ không cho phép thực hiện điều đó một cách an toàn ... Và nếu bạn cần, hãy tự thực hiện chúng bằng ngôn ngữ cấp thấp hơn có thể sẽ chậm hơn so với việc sử dụng ngôn ngữ "chậm".


24
Ngôn ngữ kịch bản là inheritantly những người chậm hơn sau đó biên soạn, trừ khi bạn viết thực sự khủng khiếp mã biên dịch
Will03uk

2
@ Will03uk - Điều gì khiến bạn không thể viết trình biên dịch cho một ngôn ngữ thường được viết kịch bản?
Chris Lutz

5
@Chris thì nó sẽ không phải là một ngôn ngữ kịch bản; ý nghĩa của một ngôn ngữ kịch bản là Nó được thông dịch hoặc biên dịch mã bytecode. Khi bạn biên dịch nó, không phải là nó một ngôn ngữ biên soạn
Will03uk

1
đây không phải là toàn bộ sự thật: ngữ nghĩa ngôn ngữ có ý nghĩa quan trọng bởi vì chúng xác định thông tin có sẵn cho trình tối ưu hóa và những giả định nào có thể được thực hiện một cách an toàn mà không cần phải thực hiện phân tích toàn bộ chương trình; trường hợp trong điểm: restricttừ khóa trong C hoặc luajit - từ khóa sau không thổi bay mọi vm khác cho các ngôn ngữ động ra khỏi nước chỉ vì Mike là một chàng trai thông minh, mà còn vì ngữ nghĩa của Lua khá rõ ràng (so với ví dụ: JavaScript)
Christoph

1
@Christoph Điều tôi muốn nói là không có viên đạn bạc. Nếu bạn cần những thứ như cử động, các cuộc gọi ảo, bốc nóng của mã, hoặc gõ vịt, một ngôn ngữ mà có vẻ "chậm" cung cấp nó ra khỏi hộp có lẽ là nhanh hơn so với việc thực hiện ngây thơ trong C.
fortran
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.