MATLAB có nhanh hơn C++ không?

Tôi đã sử dụng Matlab và C++ được khoảng 10 năm. Đối với mọi thuật toán số được triển khai cho nghiên cứu của tôi, tôi luôn bắt đầu từ việc tạo mẫu bằng Matlab và sau đó dịch dự án sang C ++ để đạt được cải thiện hiệu suất gấp 10 lần đến 100 lần (tôi không đùa đâu). Tất nhiên, tôi đang so sánh mã C++ được tối ưu hóa với mã Matlab được vector hóa hoàn toàn. Trung bình, sự cải thiện là khoảng 50 lần

Có rất nhiều điều tinh tế đằng sau cả hai ngôn ngữ lập trình và sau đây là một số hiểu lầm

  1. Matlab là ngôn ngữ kịch bản nhưng C++ được biên dịch

    Matlab sử dụng trình biên dịch JIT để dịch tập lệnh của bạn sang mã máy, bạn có thể cải thiện tốc độ của mình tối đa theo hệ số 1. 5 thành 2 bằng trình biên dịch mà Matlab cung cấp

  2. Mã Matlab có thể được vector hóa hoàn toàn nhưng bạn phải tối ưu hóa mã của mình bằng tay trong C++

    Mã Matlab được vector hóa hoàn toàn có thể gọi các thư viện được viết bằng C++/C/Assembly (ví dụ: Intel MKL). Nhưng mã C++ đơn giản có thể được vector hóa một cách hợp lý bởi các trình biên dịch hiện đại

  3. Các hộp công cụ và quy trình mà Matlab cung cấp phải được điều chỉnh rất tốt và phải có hiệu suất hợp lý

    Không. Khác với các thói quen đại số tuyến tính, hiệu suất nói chung là xấu

Lý do tại sao bạn có thể đạt được hiệu suất 10x~100x trong C++ so với mã Matlab vector hóa

  1. Gọi các thư viện bên ngoài (MKL) trong Matlab tốn thời gian

  2. Bộ nhớ trong Matlab được cấp phát và giải phóng động. Ví dụ, phép nhân ma trận nhỏ.
    ______1
    yêu cầu Matlab tạo 2 ma trận tạm thời. Và trong C++, nếu bạn cấp phát bộ nhớ trước, bạn sẽ tạo KHÔNG CÓ. Và bây giờ hãy tưởng tượng bạn lặp lại câu nói đó 1000 lần. Một giải pháp khác trong C++ được cung cấp bởi C++11 Rvalue reference. Đây là một trong những cải tiến lớn nhất trong C++, bây giờ mã C++ có thể nhanh như mã C thuần túy.

  3. Nếu bạn muốn xử lý song song, mô hình Matlab là đa xử lý và cách của C++ là đa luồng. Nếu bạn có nhiều tác vụ nhỏ cần được song song hóa, C++ cung cấp mức tăng tuyến tính cho nhiều luồng nhưng bạn có thể có mức tăng hiệu suất âm trong Matlab

  4. Vectorization trong C++ liên quan đến việc sử dụng nội tại/assembly và đôi khi vector hóa SIMD chỉ có thể thực hiện được trong C++

  5. Trong C ++, một lập trình viên có kinh nghiệm có thể tránh hoàn toàn lỗi bộ đệm L2 và thậm chí bỏ lỡ bộ đệm L1, do đó đẩy CPU đến giới hạn thông lượng lý thuyết của nó. Hiệu suất của Matlab có thể tụt hậu so với C++ gấp 10 lần chỉ vì lý do này

  6. Trong C++, các lệnh chuyên sâu tính toán đôi khi có thể được nhóm theo độ trễ của chúng (mã cẩn thận trong hợp ngữ hoặc nội tại) và các phụ thuộc (hầu hết thời gian được thực hiện tự động bởi trình biên dịch hoặc phần cứng CPU), sao cho IPC lý thuyết (các lệnh trên mỗi chu kỳ xung nhịp) có thể là

Tuy nhiên, thời gian phát triển trong C++ cũng là một hệ số gấp 10 lần so với Matlab

Những lý do tại sao bạn nên sử dụng Matlab thay vì C++

  1. Trực quan hóa dữ liệu. Tôi nghĩ sự nghiệp của tôi có thể tiếp tục mà không cần C++ nhưng tôi sẽ không thể tồn tại nếu không có Matlab chỉ vì nó có thể tạo ra những đồ thị đẹp

  2. Các hộp công cụ và thói quen tích hợp hiệu quả thấp nhưng mạnh mẽ về mặt toán học. Nhận câu trả lời đúng trước rồi mới nói đến hiệu quả. Mọi người có thể mắc những lỗi nhỏ trong C++ (ví dụ: chuyển đổi hoàn toàn double thành int) và nhận được kết quả chính xác

  3. Thể hiện ý tưởng của bạn và trình bày mã của bạn với đồng nghiệp của bạn. Mã Matlab dễ đọc và ngắn hơn nhiều so với C++ và mã Matlab có thể được thực thi chính xác mà không cần trình biên dịch. Tôi chỉ từ chối đọc mã C++ của người khác. Tôi thậm chí không sử dụng các thư viện khoa học C++ GNU vì chất lượng mã không được đảm bảo. Thật nguy hiểm khi một nhà nghiên cứu/kỹ sư sử dụng thư viện C++ làm hộp đen và coi độ chính xác là điều hiển nhiên. Ngay cả đối với các thư viện C/C++ thương mại, tôi nhớ rằng trình biên dịch Intel đã có lỗi ký hiệu trong hàm sin() của nó vào năm ngoái và các vấn đề về độ chính xác của số cũng xảy ra trong MKL

  4. Gỡ lỗi tập lệnh Matlab với bảng điều khiển tương tác và không gian làm việc hiệu quả hơn nhiều so với trình gỡ lỗi C++. Tìm lỗi tính toán chỉ mục trong Matlab có thể được thực hiện trong vòng vài phút, nhưng có thể mất hàng giờ trong C++ để tìm ra lý do tại sao chương trình gặp sự cố ngẫu nhiên nếu kiểm tra ranh giới bị loại bỏ vì lợi ích của tốc độ

Cuối cùng nhưng không kém phần

Bởi vì một khi mã Matlab được vector hóa, lập trình viên sẽ không còn nhiều thời gian để tối ưu hóa, hiệu suất mã Matlab ít nhạy cảm hơn nhiều đối với chất lượng của mã so với mã C++. Do đó, tốt nhất là tối ưu hóa các thuật toán tính toán trong Matlab và các thuật toán tốt hơn một chút thường có hiệu suất tốt hơn một chút trong Matlab. Mặt khác, kiểm tra thuật toán trong C++ yêu cầu lập trình viên giỏi viết các thuật toán được tối ưu hóa ít nhiều theo cùng một cách và để đảm bảo trình biên dịch không tối ưu hóa các thuật toán theo cách khác.

Kinh nghiệm gần đây của tôi về C++ và Matlab

Tôi đã tạo một số công cụ phân tích dữ liệu Matlab lớn trong năm qua và gặp phải vấn đề về tốc độ chậm của Matlab. Nhưng tôi đã có thể cải thiện tốc độ chương trình Matlab của mình lên gấp 10 lần nhờ các kỹ thuật sau

  • Chạy/lập cấu hình tập lệnh Matlab, triển khai lại các quy trình quan trọng trong C/C++ và biên dịch với MEX. Các thói quen quan trọng hầu hết đều đơn giản về mặt logic nhưng nặng về số lượng. Điều này cải thiện tốc độ gấp 5 lần

  • Đơn giản hóa ". m" được gửi cùng với hộp công cụ Matlab bằng cách nhận xét tất cả các kiểm tra an toàn không cần thiết và tính toán tham số đầu ra. Xin lưu ý rằng mã đã sửa đổi không thể được phân phối với phần còn lại của tập lệnh người dùng. Điều này cải thiện tốc độ thêm 2 lần nữa (sau C/C++ và MEX)

Mã được cải thiện là ~98% trong Matlab và ~2% trong C++

Tôi tin rằng có thể cải thiện tốc độ thêm 2 lần nữa (tổng cộng 20 lần) nếu toàn bộ công cụ được mã hóa bằng C++, đây là tốc độ cải thiện ~100 lần của các quy trình tính toán. I/O của ổ cứng sau đó sẽ chi phối thời gian chạy chương trình

Câu hỏi dành cho kỹ sư Mathworks

Khi mã Matlab được véc tơ hóa hoàn toàn, một trong những yếu tố hạn chế hiệu suất là hoạt động lập chỉ mục ma trận. Chẳng hạn, một phép toán sai phân hữu hạn cần được thực hiện trên Ma trận A có kích thước 5000x5000

B = A(:,2:end)-A(:,1:end-1)

Hoạt động lập chỉ mục ma trận làm cho mã Matlab chậm hơn nhiều lần so với mã C++. Hiệu suất lập chỉ mục ma trận có thể được cải thiện không?

MATLAB hay C cái nào tốt hơn?

Theo kinh nghiệm của chúng tôi về máy tính kỹ thuật, chúng tôi thấy rằng MATLAB phù hợp hơn nhiều so với C cho nhiệm vụ này nhưng sự lựa chọn tốt nhất về tính rõ ràng và chức năng của ngôn ngữ được cung cấp bởi Python

Ngôn ngữ nào nhanh hơn C?

Đi . Go, còn được gọi là Golang, là một ngôn ngữ lập trình được phát triển bởi Google. Nó biên dịch thành Hợp ngữ giống như hầu hết các ngôn ngữ khác ở đây, nhưng nó có nhiều tính năng hiện đại hơn, cú pháp đơn giản hơn và dễ viết hơn so với ngôn ngữ lập trình nhanh dẫn đầu lâu đời là C/C++.

MATLAB chậm như thế nào so với C++?

Vì vậy, bạn có thể trình bày lại quan sát của họ là "MATLAB sử dụng vòng lặp for chậm hơn 9 đến 11 lần so với C++". Vì vậy, vâng, nếu bạn chọn một thuật toán không tốt trong việc vector hóa trong những gì MATLAB cung cấp, thì không có gì ngạc nhiên khi nó chậm hơn từ 9 đến 11 lần.

MATLAB có tốt hơn C++ không?

C++ có tốc độ xử lý trung bình nhanh hơn 500 lần so với mã Matlab . Điều này không chỉ áp dụng cho mã này mà còn có thể áp dụng cho bất kỳ so sánh mã nào khác giữa các tệp MEX của Matlab và C++.