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 tic
và toc
. Đ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ạ:
- 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.
- 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?
Độ 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ẽ. –
@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? –
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. –