2013-09-03 70 views
6

Tôi đã viết mã C++ đơn giản và thử nghiệm trong C++, sau đó tôi đã sửa mã giống nhau cho MATLAB bằng mex file_name.cpp và chạy cùng mã trong MATLAB đang sử dụng trình biên dịch giống như C++. Đây là mã:So sánh tốc độ Matlab vs C++ trong mã này

int k; 
for(int j = 0; j < 100;j++){ 
    for(int i = 0; i < 10000000; i++){ 
     k++; 
    } 
    k/=10000000 
} 

đây là mã MATLAB:

double a;int j;int i; 
double* k; 

for(j = 0; j < 100;j++){ 
    for(i = 0; i < 10000000; i++){ 
     a = a+1; 
    } 
    a = a/10000000; 
} 

plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); 
k = mxGetPr(plhs[0]); 
*k = (double)a; 

Tôi đã chỉnh sửa mã này cho MATLAB, tức là thay đổi với các loại phù hợp, thêm MEX chức năng vv và kết quả là khoảng 900ms trong MATLAB trái ngược với 3100 ms trong C++. Điều tôi không hiểu là cả hai đều đang chạy cùng một mã và với cùng trình biên dịch (trong MATLAB tôi viết mex -setup trong dòng lệnh và trình biên dịch Visual Studio được chọn làm trình biên dịch MEX), tuy nhiên, MATLAB là khoảng nhanh hơn 3,5 lần.

MATLAB làm gì để nhanh hơn và C++ không làm gì? Ai đó có thể giải thích cho tôi tại sao có sự khác biệt rất lớn? Tôi đã thử một số mã khác, tất cả đều nhanh hơn 3-6 lần trong MATLAB.

Máy tính của tôi là Windows 7 64 bit, Visual Studio 2010 được sử dụng cho C++, MATLAB là R2012b.

Có thể điều này là do phiên bản Visual Studio của tôi không? Nếu tôi thay đổi nó thành VS2012, nó sẽ nhanh hơn?

mex -v đầu ra ở đây.

Cảm ơn,

+0

Trình biên dịch vẫn còn s #### y, chúng không thể xóa bỏ vòng lặp đơn giản luôn trả về cùng giá trị? Xe bay của tôi đâu rồi! :-) – xanatos

+0

sử dụng 'mex -v' để biên dịch mex và xem những gì cờ matlab đang sử dụng. – Shai

+6

bạn đang biên soạn trong chế độ gỡ lỗi hoặc phát hành trong VS? – Shai

Trả lời

3

Hiệu suất phụ thuộc rất lớn vào nền tảng, hệ điều hành, trình biên dịch, vv Dù Matlab đang làm trong trường hợp này, nó bằng cách nào đó đã cố gắng tìm một tối ưu hóa mà trình biên dịch VS2010 thì không. Tôi sẽ mạo hiểm để đoán rằng việc nâng cấp lên VS2012 sẽ không tạo ra sự khác biệt đáng kể, nhưng tôi có thể sai. Đó là, sau khi tất cả, một trình biên dịch khác nhau.

Tôi sẽ thừa nhận rằng điều này có phần đáng ngạc nhiên, nhưng hãy kiểm tra cờ biên soạn của bạn và thử lược tả với các cấu hình khác nhau. Nếu cài đặt Matlab của bạn là 32 bit, điều đó cũng có thể tạo ra sự khác biệt.

Cũng có thể có sự khác biệt nhỏ trong mã của bạn, có thể đủ nhẹ để bạn có thể không nhận thấy. Mã của bạn có thể liên kết với các thư viện khác cũng có thể có sự thay đổi lớn về hiệu suất.

Bài học ở đây là rất khó để ghim xuống chính xác lý do tại sao một điều hoạt động tốt hơn một điều khác.

EDIT: Bạn đã đề cập rằng mã được biên dịch để gỡ lỗi. Điều này chỉ làm tăng thêm sự thay đổi của trình biên dịch nào, vì việc kích hoạt các tùy chọn gỡ lỗi cũng có thể tắt các tối ưu hóa khác, và mỗi trình biên dịch có ý tưởng khác nhau về loại thông tin gỡ lỗi nào là quan trọng và đáng giá trong mã của bạn.

Tôi khuyên bạn nên tắt tất cả các tùy chọn gỡ lỗi để có được đầu ra phù hợp hơn. Tôi cũng khuyên bạn nên đảm bảo rằng bạn đang biên dịch với các mức độ tối ưu hóa tương tự, có thể là mức tối ưu nhất có thể hoặc không hoàn toàn.

+0

Tôi đã thay đổi tối ưu hóa nhưng một số người trong số họ đưa ra lỗi, nói rằng tùy chọn dòng lệnh "Lỗi dòng lệnh D8016: '/ ZI' và '/ Ob1' không tương thích". – smttsp

+0

Vâng, đó là do chế độ phát hành/gỡ lỗi. Khi tôi thay đổi gỡ lỗi để phát hành nó trở thành '920 ms' gần giống với thời gian chạy MATLAB – smttsp

+0

Đối với mã đơn giản, tôi nghĩ rằng hai trình biên dịch sẽ mang lại kết quả tương tự, mặc dù vẫn còn nhiều chỗ cho biến đổi do các thông số khác. – patrickvacek

3

Trong C++, bạn sử dụng int k trong vòng lặp bên trong, trong khi ở các mã MATLAB, bạn sử dụng double a (và kỳ quặc, thay đổi từ a++ ký hiệu để a=a+1 ...)

Bạn để lại cho họ cả unininialized ; xem this question là lý do tại sao điều đó là xấu.

Tệp MEX theo mặc định trong ANSI C. Mã của bạn thực sự trông giống như vậy. Kiểm tra kỹ số mex -setup của bạn; bạn có thể đã vô tình chọn một trình biên dịch C, nghĩ rằng bạn đã chọn một C++.

Cũng đảm bảo rằng bạn có cùng một bộ tùy chọn trình biên dịch cho cả hai biên dịch. Chính xác giống nhau.

Nhưng tôi nghĩ rằng cốt lõi của vấn đề là bạn đang làm nguyên số học trong C++ phiên bản và đôi số học trên phiên bản MATLAB. Điều này có thể tạo nên sự khác biệt đáng kể.

Khác với điều đó và những gì đã được đề cập ở đây, sẽ không có sự khác biệt. Trong thực tế, bất kỳ trình biên dịch tốt với thậm chí tối ưu hóa cơ bản sẽ có thể phát hiện ra rằng vòng lặp này là khá tầm thường, và loại bỏ nó hoàn toàn.

+0

Nó không liên quan đến 'mex -setup'. Có sự khác biệt nhỏ giữa C++ và matlab sau khi thay đổi nó sang chế độ phát hành nhưng điều này có thể chấp nhận được so với chậm hơn 3,5 lần. – smttsp

+0

@smttsp: Bạn thấy "được chấp nhận" là gì? Có * nên * không có sự khác biệt nào cả. –

+0

Là chậm hơn 1-10% so với matlab là chấp nhận được vì điều này có thể do trạng thái của máy, các chương trình khác, vv Nhưng chậm hơn 3,5 lần là hoàn toàn không thể chấp nhận. – smttsp

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