2010-10-15 83 views
24

Tôi đang cố gắng đo thời gian thực hiện một chức năng.Thời gian đo được thực hiện bởi một hàm: clock_gettime

Tôi có một vấn đề nhỏ: mặc dù tôi đang cố gắng chính xác và sử dụng các dấu phẩy động, mỗi lần tôi in mã bằng% lf tôi nhận được một trong hai câu trả lời: 1.000 ... hoặc 0.000 .... dẫn tôi đến thắc mắc xem mã của tôi có đúng không:

#define BILLION 1000000000L; 

// Calculate time taken by a request 
struct timespec requestStart, requestEnd; 
clock_gettime(CLOCK_REALTIME, &requestStart); 
function_call(); 
clock_gettime(CLOCK_REALTIME, &requestEnd); 

// Calculate time it took 
double accum = (requestEnd.tv_sec - requestStart.tv_sec) 
    + (requestEnd.tv_nsec - requestStart.tv_nsec) 
/BILLION; 
printf("%lf\n", accum); 

Hầu hết mã này chưa được tôi thực hiện. Trang ví dụ này có mã minh họa việc sử dụng clock_gettime: http://www.users.pjwstk.edu.pl/~jms/qnx/help/watcom/clibref/qnx/clock_gettime.html

Có thể vui lòng cho tôi biết điều gì không chính xác hoặc tại sao tôi chỉ nhận giá trị số nguyên?

Thank you very much,

Jary

+11

Không, không, không: don' t đặt tên cho các số. Thay vào đó, hãy sử dụng hàm mà họ phân phối: '#define CLOCK_PRECISION 1000000000L/* một tỷ * /' – pmg

+9

@pmg: Tiếp tuyến giả: Tôi cho rằng tên như 'CLOCK_PRECISION' sẽ chỉ cần thiết nếu đơn vị không rõ ràng từ tên biến. Trong trường hợp trên, nó rõ ràng với cái tên 'tv_nsec' mà chúng ta đang tính bằng nano giây. Vì vậy, 'NANOSECONDS_PER_SECOND' có thể phù hợp, nhưng thực sự không khác gì nhiều so với' BILLION'. –

Trả lời

22

Chia một số nguyên do một số nguyên mang lại một số nguyên. Hãy thử điều này:

#define BILLION 1E9 

Và không sử dụng dấu chấm phẩy ở cuối dòng. #define là một chỉ thị tiền xử lý, không phải là một tuyên bố và bao gồm dấu chấm phẩy dẫn đến BILLION được định nghĩa là 1000000000L;, điều này sẽ bị hỏng nếu bạn cố gắng sử dụng nó trong hầu hết các ngữ cảnh. Bạn đã may mắn vì bạn đã sử dụng nó ở cuối biểu thức và bên ngoài bất kỳ dấu ngoặc đơn nào.

+2

Cảm ơn rất nhiều sự giúp đỡ của bạn. Và cảm ơn vì đã cho tôi biết về dấu chấm phẩy, đó là điều tôi đã quên. Cảm ơn nhiều! – Jary

+0

Vì lợi ích của hiệu suất .. #define ONE_OVER_BILLION 1E-9 và sử dụng nhân. – linleno

9

(requestEnd.tv_nsec - requestStart.tv_nsec) là loại số nguyên và luôn nhỏ hơn BILLION, do đó kết quả chia cho nhau theo số nguyên sẽ luôn là 0. Bạn cần phải đúc kết quả phép trừ, ví dụ: double trước khi chia.

1

Lưu ý rằng (requestEnd.tv_nsec - requestStart.tv_nsec) có thể âm, trong trường hợp này bạn cần trừ đi 1 giây từ chênh lệch tv_sec và thêm một TRIỆU vào sự khác biệt tv_nsec.

0

Tôi biết câu hỏi đã được đăng từ lâu, nhưng tôi vẫn không thấy câu trả lời gợi ý bạn "chuyển đổi" thời gian đã trôi qua thành nano giây (hoặc mili giây) và không thành giây như trong mẫu mã của bạn.

Các mẫu mã đoạn để minh họa cho ý tưởng:

long accum = (requestEnd.tv_nsec - requestStart.tv_nsec) 
+ (requestEnd.tv_sec - requestStart.tv_sec) * BILLION; 

Bằng cách này bạn có thể tránh được điểm số học, có thể là nặng đối với một số nền tảng nổi ...

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