Tốc độ C so với C ++

Đánh giá hiệu suất của các ngôn ngữ lập trình, C thường được gọi là ngôn ngữ dẫn đầu, mặc dù Fortran thường nhanh hơn. Các ngôn ngữ lập trình mới thường sử dụng C làm tài liệu tham khảo và họ thực sự tự hào vì chỉ chậm hơn C rất nhiều. Rất ít nhà thiết kế ngôn ngữ cố gắng đánh bại C

Điều gì làm cho một ngôn ngữ nhanh hơn C?

Thông tin bí danh tốt hơn

Bí danh mô tả thực tế là hai tham chiếu có thể trỏ đến cùng một vị trí bộ nhớ. Ví dụ: xem xét bản sao bộ nhớ chính tắc (không phải memcpy từ stdlib.h. )

void* memcopy(void* dst, const void* src, size_t count) {
   char *d = (char*) dst; // pointer arithmetic requires non-void
   const char *s = (char*) src;
   while (count--) *d++ = *s++;
   return dst;
}

Tùy thuộc vào kiến ​​trúc mục tiêu, trình biên dịch có thể thực hiện nhiều tối ưu hóa với mã này. Ví dụ: trên x86 hiện đại với lệnh SSE MOVDQU, nó có thể sao chép các khối 16 Byte thay vì 4 Byte (sizeof(void*)). Tiếc là không có. Do bí danh, chẳng hạn, dst có thể là src+1. Trong trường hợp này, kết quả phải là từ đầu tiên *src được lặp lại count lần tại dst. Trình biên dịch không được phép sử dụng

MyClass obj = new MyClass();
1 do ngữ nghĩa của C

Trong C99, từ khóa memcpy0 đã được thêm vào, mà chúng ta có thể sử dụng ở đây để mã hóa rằng memcpy1 và dst khác với tất cả các tham chiếu khác. Cơ chế này giúp trong một số trường hợp, nhưng không phải trong ví dụ của chúng tôi

Ngữ nghĩa của Fortran nói rằng các đối số của hàm không bao giờ là bí danh và có một kiểu mảng, trong đó các mảng trong C là các con trỏ. Đây là lý do tại sao Fortran thường nhanh hơn C. Đây là lý do tại sao các thư viện số vẫn được viết bằng Fortran. Tuy nhiên, nó phải trả giá bằng số học con trỏ

Một ngôn ngữ muốn nhanh hơn C nên cung cấp ngữ nghĩa trong đó trình biên dịch có thể phân tích răng cưa tốt hơn

Đẩy tính toán sang thời gian biên dịch

Làm mọi thứ trong thời gian biên dịch giúp giảm thời gian chạy. Tất nhiên, trình biên dịch C làm điều này cho các trường hợp tầm thường như memcpy3, trong đó phần bổ sung đã được xử lý tại thời điểm biên dịch

Tuy nhiên, các ngôn ngữ có hỗ trợ lập trình meta tốt cho phép lập trình viên thực hiện các tối ưu hóa cụ thể cho ứng dụng tương tự. Một ví dụ đơn giản, chúng ta có thể tối ưu hóa memcpy4 thành memcpy5 mà trình biên dịch không cần biết về các số Fibonacci

Ví dụ thực tế, thư viện Eigen C++ dành cho đại số tuyến tính sử dụng các mẫu C++ để tránh sao chép và lười tính toán. Tất nhiên Lisp là ông tổ của kỹ thuật này với hệ thống vĩ mô của nó. Ví dụ, có một giai thoại hay về một sinh viên sử dụng Đề án cho một bài tập. Về cơ bản, lập trình viên có thể sửa đổi cây cú pháp trừu tượng trong quá trình biên dịch. Sự đánh đổi với các tính năng lập trình meta như vậy là sự phức tạp. Lập trình viên đánh giá thấp độ khó để viết các macro chính xác giống như họ đánh giá thấp độ khó để viết các chương trình đồng thời chính xác

Một nhà thiết kế ngôn ngữ nên nghĩ về lập trình meta. Một cái gì đó Turing hoàn chỉnh như các mẫu C ++, dường như có lợi cho hiệu suất

Tối ưu hóa thời gian chạy

Trong thời gian chạy, có thông tin động không có sẵn cho trình biên dịch tĩnh. Bất kỳ ví dụ cụ thể nào cũng có thể được sao chép bởi chương trình C, nhưng thường thì điều đó là không khả thi. Thủ thuật tối ưu hóa theo hướng dẫn hồ sơ chỉ giải quyết được một phần nhỏ của vấn đề

Điều trở nên đặc biệt dễ dàng trong thời gian chạy là tối ưu hóa toàn thế giới. Mặc dù điều này có thể thực hiện được một cách tĩnh, ngữ nghĩa C (đơn vị biên dịch) và bộ tiền xử lý bắt buộc gây khó khăn cho trình biên dịch. Ngay cả Python cũng có thể đánh bại C bằng cách nội tuyến qua các đường viền tệp

Tất nhiên, có những nhược điểm khi sử dụng JIT và đặc biệt là trong các hệ thống- và lập trình nhúng, nó không phù hợp. Vì vậy, có thể có những ví dụ mà Java, C# hoặc những thứ khác đánh bại C, nhưng chúng không đe dọa đến thị trường ngách của C

Cấp độ hướng dẫn song song

Các CPU hiện đại cung cấp các hướng dẫn SIMD cho các vectơ, như tiện ích mở rộng AVX của Intel. Mặc dù điều này có thể được sử dụng trong C với nội tại, nhưng nó có thể được thực hiện dễ dàng hơn nhiều bằng ngôn ngữ khác. Cho đến nay, việc khai thác nó tự động bởi trình biên dịch vẫn chưa thành công, vì vậy hỗ trợ ngôn ngữ sẽ có lợi

Sự kết luận

Thông tin bí danh là thông tin duy nhất mà tôi chắc chắn về việc cải thiện tốc độ, vì không thể đạt được tốc độ Fortran trong C. Các ý tưởng khác liên quan nhiều hơn đến việc viết các chương trình nhanh hơn dễ dàng hơn

Bạn có thể đã bắt gặp những tuyên bố này, C được tối ưu hóa hơn hoặc hiệu suất của C tốt hơn các ngôn ngữ cao hơn, vì vậy tôi sẽ thảo luận về lý do của giả thuyết này.  

Trước tiên, hãy liệt kê các chức năng được cung cấp bởi các ngôn ngữ như Java chứ không phải C.  

  1. Kiểm tra ràng buộc chỉ mục mảng
  2. Kiểm tra giá trị biến chưa được khởi tạo
  3. Kiểm tra rò rỉ bộ nhớ
  4. Kiểm tra tham chiếu con trỏ null
  5. Thu gom rác tự động
  6. Kiểm tra loại thời gian chạy
  7. xử lý ngoại lệ

và có nhiều tính năng như vậy không có trong C.
Các tính năng bổ sung phải trả giá và chi phí bao gồm giảm tốc độ và tăng kích thước.
Hãy lấy một ví dụ về phân bổ động trong C và Java 
Java.

MyClass obj = new MyClass();

Bạn đã xem xét kích thước của obj chưa, câu trả lời là Không. Lý do là nó được xử lý tự động bởi chính ngôn ngữ trong nền và bạn không phải viết mã cụ thể cho nó.
Nhưng trong trường hợp của C 

struct MyStruct *obj = malloc(sizeof(struct MyStruct));

Như bạn có thể thấy trong đoạn mã trên, nhiệm vụ gán tham chiếu cho con trỏ, phân bổ kích thước được lập trình viên thực hiện rõ ràng và cuối cùng giải phóng bộ nhớ được phân bổ.
Kiểm tra giới hạn mảng được hỗ trợ bởi Môi trường thực thi ngón tay cái (ThumbEE), các tính năng khác của nó bao gồm kiểm tra con trỏ null tự động trên mỗi lệnh tải và lưu trữ, một lệnh đặc biệt gọi trình xử lý.
Một lý do khác là sự gần gũi của C với hợp ngữ, trong hầu hết các trường hợp, các hướng dẫn của nó ánh xạ trực tiếp sang hợp ngữ, C chỉ cách ngôn ngữ hợp ngữ một hoặc hai mức trừu tượng trong khi Java thì khác .

Tham khảo.
1) tại sao-là-c-so-nhanh-và-tại sao-không-ngôn ngữ khác-như-nhanh-hoặc-nhanh hơn 
2) ARM_architecture . 28Ngón tay cáiEE. 29 
3) Chế độ xem của Linus Torvalds 

Bài viết này được đóng góp bởi Mandeep Singh. Nếu bạn thích GeeksforGeeks và muốn đóng góp, bạn cũng có thể viết một bài báo bằng cách sử dụng write. chuyên viên máy tính. org hoặc gửi bài viết của bạn tới review-team@geeksforgeeks. tổ chức. Xem bài viết của bạn xuất hiện trên trang chính của GeeksforGeeks và trợ giúp các Geeks khác.  

Vui lòng viết bình luận nếu bạn thấy bất cứ điều gì không chính xác hoặc bạn muốn chia sẻ thêm thông tin về chủ đề thảo luận ở trên.  

C hay C nhanh hơn?

C nhanh hơn C++ . Điều này có nghĩa là nếu cẩn thận, chương trình C++ ít nhất sẽ nhanh bằng chương trình C. Ưu điểm của C++ so với C là nó cho phép chúng ta xây dựng các bản tóm tắt có thể tái sử dụng với các mẫu, OOP và thành phần chức năng.

C so với C ++ nhanh như thế nào?

Mã giống nhau trong C và C++ thường chạy ở tốc độ chính xác như nhau , ngoại trừ mã có ngữ nghĩa khác nhau do quy tắc răng cưa khác nhau, v.v. Sự khác biệt giữa thành ngữ C và thành ngữ C++.

Là C nhanh hơn C sắc nét?

Hiệu suất. C ++ được sử dụng rộng rãi khi các ngôn ngữ cấp cao hơn không hiệu quả. Mã C++ nhanh hơn nhiều so với mã C# , điều này khiến mã này trở thành giải pháp tốt hơn cho các ứng dụng coi trọng hiệu suất.

C chậm hơn bao nhiêu so với C++?

Hyperfine cho tôi biết rằng chương trình C++ dựa trên thư viện C++ được tải động mất gần 1 ms thời gian hơn chương trình C.