2013-01-31 28 views
8

Tôi đã viết một số mã C mà tôi gọi là MATLAB sau khi tôi biên dịch nó bằng MEX. Bên trong mã C, tôi đo thời gian của một phần của việc tính toán bằng cách sử dụng đoạn mã sau:Sự khác biệt của đồng hồ tic-toc & C của MATLAB

clock_t begin, end; 
double time_elapsed; 
begin = clock(); 
/* do stuff... */ 
end = clock(); 
time_elapsed = (double) ((double) (end - begin)/(double) CLOCKS_PER_SEC); 

Thời gian đã qua nên thời gian thực hiện chỉ trong vài giây.

Sau đó, tôi xuất giá trị time_elapsed thành MATLAB (nó được xuất đúng cách; tôi đã chọn). Sau đó, MATLAB-side tôi gọi hàm C này (sau khi tôi biên dịch nó bằng MEX) và tôi đo thời gian thực hiện của nó bằng cách sử dụng tictoc. Điều gì hóa ra là một sự ngớ ngẩn hoàn toàn là thời gian tôi tính toán bằng tic và toc là 0.0011s (trung bình trên 500 lần chạy, st. Dev. 1.4e-4) trong khi thời gian được trả về bởi mã C là 0.037s (trung bình trên 500 lần chạy, st. dev 0,0016).

Ở đây người ta có thể nhận thấy hai sự kiện rất lạ:

  1. Thời gian thực hiện cho toàn bộ chức năng là thấp hơn so với thời gian thực hiện cho một phần của mã này. Do đó, đo lường của MATLAB hoặc C là không chính xác.
  2. Thời gian thực hiện được đo bằng mã C rất phân tán và có độ cao rất cao. độ lệch (coeff. của biến thể 44%, so với chỉ 13% đối với tic-toc).

Điều gì đang xảy ra với những bộ hẹn giờ này?

+0

Độ phân giải của đồng hồ là gì? Làm thế nào để chúng ta biết nếu 'bắt đầu = đồng hồ();' được thực hiện ngay trước hoặc ngay sau khi một đồng hồ đánh dấu vui vẻ? Điều đó có ảnh hưởng đến kết quả không? Có lẽ. –

+0

@BoPersson Vì vậy, bạn có nghĩa là 'đồng hồ()' có thể bỏ lỡ một đánh dấu nhiều nhất? –

+4

Tôi có nghĩa là một dấu tích có thể đủ lớn để ảnh hưởng đến kết quả. Như 18 ms. –

Trả lời

6

Bạn đang so sánh táo với cam.

Nhìn vào tài liệu của Matlab:

tic-http://www.mathworks.com/help/matlab/ref/tic.html
toc - http://www.mathworks.com/help/matlab/ref/toc.html

tictoc cho phép bạn đo lường thời gian thực trôi qua.

Bây giờ hãy xem đồng hồ chức năng http://linux.die.net/man/3/clock.

Đặc biệt,

Đồng hồ() chức năng trả về một xấp xỉ thời gian xử lý sử dụng bởi các chương trình.

Giá trị được trả lại là Thời gian CPU được sử dụng cho đến thời điểm này làm đồng hồ_t; để nhận số giây được sử dụng, chia cho CLOCKS_PER_SEC. Nếu thời gian xử lý được sử dụng không khả dụng hoặc giá trị của nó không thể là được biểu thị, hàm trả về giá trị (clock_t) -1.

Vì vậy, những gì có thể giải thích cho sự khác biệt của bạn:

  • thời gian CPU (đo bằng đồng hồ()) và thời gian trôi qua thật (đo bằng tic và toc) là không giống nhau. Vì vậy, bạn sẽ mong đợi rằng thời gian cpu để được ít hơn thời gian trôi qua? Vâng, có thể.Điều gì sẽ xảy ra nếu trong vòng 0,0011 bạn đang lái 10 lõi ở mức 100%? Điều đó có nghĩa là đồng hồ đo() là 10x đo bằng tic và toc. Có thể, không chắc.
  • đồng hồ (.) Gần như không chính xác và phù hợp với tài liệu, đây là số đo gần đúng cpu! Tôi nghi ngờ rằng nó được gắn với kích thước lượng tử của trình lên lịch, nhưng tôi đã không đào sâu qua mã hạt nhân Linux để kiểm tra. Tôi cũng không kiểm tra trên các hệ điều hành khác, nhưng this dude's blog phù hợp với lý thuyết đó.

Vì vậy, phải làm gì ... cho người mới bắt đầu, so sánh táo với táo! Tiếp theo, hãy đảm bảo bạn tính đến độ phân giải hẹn giờ của tài khoản.

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