2012-05-09 35 views
9

Tôi muốn đo thời gian hệ thống cần để thực thi một số mã. Để thực hiện điều này, tôi biết tôi sẽ bánh sandwich cho biết mã giữa hai cuộc gọi đến getrusage(), nhưng tôi nhận được một số kết quả bất ngờ ...Bắt getrusage() để đo thời gian hệ thống trong C

#include <sys/time.h> 
#include <sys/resource.h> 
#include <unistd.h> 
#include <stdio.h> 

int main() { 
    struct rusage usage; 
    struct timeval start, end; 
    int i, j, k = 0; 

    getrusage(RUSAGE_SELF, &usage); 
    start = usage.ru_stime; 
    for (i = 0; i < 10000; i++) { 
    /* Double loop for more interesting results. */ 
    for (j = 0; j < 10000; j++) { 
     k += 20; 
    } 
    } 
    getrusage(RUSAGE_SELF, &usage); 
    end = usage.ru_stime; 

    printf("Started at: %ld.%lds\n", start.tv_sec, start.tv_usec); 
    printf("Ended at: %ld.%lds\n", end.tv_sec, end.tv_usec); 
    return 0; 
} 

Tôi hy vọng rằng điều này tạo ra hai con số khác nhau, nhưng than ôi! Sau khi nhìn thấy máy tính của tôi suy nghĩ trong một hoặc hai giây, đây là kết quả:

Started at: 0.1999s 
Ended at: 0.1999s 

Tôi không sử dụng getrusage() phải không? Tại sao hai con số này lại không khác nhau? Nếu tôi về cơ bản là sai, có cách nào khác để sử dụng getrusage() để đo thời gian hệ thống của một số mã nguồn không? Cảm ơn bạn đã đọc.

+1

Hãy lưu ý rằng 'tv_usec' là micro giây, do đó định dạng của bạn phải là'% lu.% 06u'. – Mapio

Trả lời

9

Bạn hiểu sai sự khác biệt giữa thời gian "người dùng" và "hệ thống". Mã ví dụ của bạn đang thực thi chủ yếu trong chế độ người dùng (tức là chạy mã ứng dụng của bạn) trong khi đang đo, nhưng thời gian "hệ thống" là thước đo thời gian thực hiện trong chế độ lõi (ví dụ: xử lý cuộc gọi hệ thống).

ru_stime là trường đúng để đo thời gian của hệ thống. Ứng dụng thử nghiệm của bạn chỉ xảy ra không tích lũy bất kỳ thời điểm nào như vậy giữa hai điểm bạn kiểm tra.

+1

Cảm ơn bạn! Bạn giải thích điều này tốt hơn giáo sư của tôi có thể. –

2

Bạn nên sử dụng usage.ru_utime, là thời gian sử dụng CPU của người dùng được sử dụng thay thế.

+0

Điều này thực sự cho tôi kết quả thích hợp hơn. Tuy nhiên, tôi vẫn bắt buộc phải tìm cách làm việc để đo thời gian hệ thống của một số mã. Việc sử dụng usage.ru_stime là gì nếu nó không hoạt động? –

+1

Nếu chương trình được thiết kế để chạy dưới chế độ hạt nhân, sau đó sử dụng 'ru_stime'. Nếu không, hãy sử dụng 'ru_utime'. – shinkou

+0

Tôi sẽ sử dụng 'clock_gettime' với đồng hồ thời gian cpu ... –

0

Sử dụng gprof. Điều này sẽ cung cấp cho bạn thời gian được thực hiện bởi mỗi chức năng. Cài đặt gprof và sử dụng các cờ này để biên soạn -pg -file-arc-phạm vi phủ sóng.

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