2012-12-20 38 views
16

Tìm kiếm một ý tưởng làm thế nào để tránh sử dụng vòng lặp trong mã Matlab của tôi, tôi thấy ý kiến ​​sau đây theo one question on SE:Làm thế nào để chuẩn hóa quy trình Matlab?

Những tuyên bố "cho vòng chậm trong Matlab" không còn nói chung là đúng từ Matlab ... euhm , R2008a?

Bạn đã cố gắng chuẩn một vòng lặp for vs những gì bạn đã có? đôi khi nó là nhanh hơn so với mã vectorized ...

Vì vậy, tôi muốn hỏi, là có cách thường được sử dụng để kiểm tra tốc độ của một quá trình trong Matlab? Người dùng có thể thấy ở đâu đó mất bao nhiêu thời gian trong quá trình hoặc cách duy nhất để mở rộng quy trình trong vài phút để so sánh thời gian giữa mỗi lần khác?

Trả lời

22

Công cụ tốt nhất để kiểm tra hiệu suất của mã MATLAB là chức năng timeit của Steve Eddins, available here từ Trao đổi tệp trung tâm MATLAB.

Nó xử lý nhiều vấn đề tế nhị liên quan đến mã MATLAB điểm chuẩn cho bạn, chẳng hạn như:

  • đảm bảo rằng biên dịch JIT được sử dụng bởi gói mã opcode cachers trong một chức năng
  • nóng lên mã
  • chạy mã nhiều lần và tính trung bình

Cập nhật: Tính từ lúc phát hành R 2013b, timeit là một phần của MATLAB cốt lõi.


Cập nhật: Tính đến phiên bản R2016a, MATLAB cũng bao gồm một performance testing framework để xử lý các vấn đề trên cho bạn trong một cách tương tự như timeit.

+2

+1 cho một phương pháp mà tôi chưa biết và điều đó dường như được suy nghĩ kỹ. – Thilo

+1

Từ "" trung bình "' là sai lầm tốt nhất khi timeit sử dụng trung bình, cũng có vẻ không có cách nào để ảnh hưởng đến trung bình và không có cách nào để thay đổi số lần chạy. Bạn có biết liệu có thể có độ lệch chuẩn trong thời gian chạy không? Nó sẽ hữu ích để làm các biện pháp cho đến SD dưới một mức độ nào đó. – hhh

+0

@hhh Tôi không chắc chắn những gì gây hiểu nhầm về từ đó - trung bình là trung bình. Dù sao - nó khá dễ dàng để sửa đổi các chức năng của 'timeit' nếu bạn thích (tôi đang giới thiệu ở đây đến phiên bản File Exchange thay vì phiên bản mới hơn, được xây dựng trong, nhưng tôi mong đợi chúng tương tự). Chỉ cần gõ 'edit timeit' để xem nội bộ của hàm, và bạn sẽ thấy nó thực hiện hàm này vài lần và sau đó gọi' median' trên chúng. Chỉ cần sửa đổi 'timeit' để xuất ra các thời điểm riêng lẻ, và bạn có thể lấy bất kỳ hình thức trung bình nào bạn thích, hoặc độ lệch chuẩn. –

13

Bạn có thể sử dụng trình hồ sơ để đánh giá lượng thời gian các chức năng của bạn và các khối mã trong đó đang thực hiện.

>> profile on; % Starts the profiler 
>> myfunctiontorun(); % This can be a function, script or block of code 
>> profile viewer; % Opens the viewer showing you how much time everything took 

Trình xem cũng xóa dữ liệu hồ sơ hiện tại trong lần tiếp theo.

Ghi nhớ, tiểu sử không có xu hướng chậm thực hiện một chút, nhưng tôi tin rằng nó thực hiện theo cách thống nhất trên mọi thứ. Rõ ràng nếu chức năng của bạn là rất nhanh chóng, bạn có thể thấy bạn không nhận được kết quả đáng tin cậy vì vậy nếu bạn có thể chạy nó nhiều lần hoặc mở rộng tính toán có thể cải thiện vấn đề. Quay lại đầu trang |

Nếu đó là những thứ thực sự đơn giản bạn đang thử nghiệm, bạn cũng có thể chỉ là thời gian nó bằng cách sử tictoc:

>> tic; % Start the timer 
>> myfunctionname(); 
>> toc; % End the timer and display elapsed time 

Ngoài ra nếu bạn muốn nhiều giờ, bạn có thể gán chúng cho các biến:

>> mytimer = tic; 
>> myfunctionname(); 
>> toc(mytimer); 

Cuối cùng, nếu bạn muốn lưu trữ thời gian đã trôi qua thay vì hiển thị nó:

>> myresult = toc; 
+4

Trình hồ sơ không làm chậm quá trình thực thi theo cách nhất thiết phải đồng nhất. Nó vô hiệu hoá trình biên dịch JIT, có thể có các hiệu ứng rất khác nhau trên các đoạn mã khác nhau. –

+1

@SamRoberts Wow, tôi không biết hồ sơ vô hiệu hóa JIT ... –

5

Tôi nghĩ rằng tôi đúng khi nói rằng nhiều người trong chúng ta thời gian Matlab bằng cách gói khối mã mà chúng tôi quan tâm ở giữa tictoc. Hơn nữa, chúng tôi cẩn thận để đảm bảo rằng tổng thời gian là khoảng 10 giây (thay vì 1 giây hoặc 100 giây) và lặp lại từ 3 - 5 lần và đo lường xu hướng trung tâm (chẳng hạn như giá trị trung bình) và rút ra kết luận của chúng tôi từ đó.

Nếu đoạn mã nhỏ hơn 10 giây, hãy lặp lại số lần cần thiết để đưa vào phạm vi, cẩn thận để tránh bất kỳ tác động nào của lần lặp lại trong lần tiếp theo. Và nếu mã tự nhiên mất 100 giây hoặc lâu hơn, hãy dành nhiều thời gian hơn cho thử nghiệm hoặc thử với dữ liệu đầu vào nhỏ giả tạo để chạy nhanh hơn.

Theo kinh nghiệm của tôi, không cần chạy chương trình trong vài phút để nhận dữ liệu về thời gian chạy trung bình với phương sai thấp chấp nhận được. Nếu tôi chạy một chương trình 5 lần và một (hoặc hai) kết quả là cực kỳ khác với ý nghĩa tôi sẽ chạy lại nó.

Tất nhiên, nếu mã có bất kỳ tính năng nào khiến thời gian chạy không xác định thì đó là vấn đề khác.

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