Tại sao thời gian thực có thể thấp hơn thời gian của người dùng


31

Tôi có một tập lệnh chuyển đổi tập tin video và tôi chạy nó ở máy chủ trên dữ liệu thử nghiệm và đo thời gian của nó bằng cách time. Kết quả tôi thấy:

real    2m48.326s
user    6m57.498s
sys     0m3.120s

Tại sao thời gian thực là thấp hơn nhiều so với thời gian người dùng? Điều này có bất kỳ kết nối với đa luồng? Hay cái gì khác?

Chỉnh sửa: Và tôi nghĩ rằng kịch bản đã chạy trong khoảng 2m48s


lại EDIT của bạn - điều đó có ý nghĩa hoàn hảo, vì realthời gian là thời gian đồng hồ treo tường như được giải thích dưới đây (tức là những gì chúng ta sẽ đo nếu chúng ta có đồng hồ bấm giờ)
Levon

Câu trả lời:


42

Đầu ra bạn hiển thị hơi kỳ lạ, vì thời gian thực thường sẽ lớn hơn hai sản phẩm kia.

  • Realthời gian là thời gian đồng hồ treo tường. (những gì chúng ta có thể đo bằng đồng hồ bấm giờ)
  • User thời gian là lượng thời gian dành cho chế độ người dùng trong quy trình
  • Sys là thời gian CPU dành cho kernel trong tiến trình.

Vì vậy, tôi cho rằng nếu công việc được thực hiện đồng thời bởi một số bộ xử lý, thời gian CPU sẽ cao hơn thời gian đồng hồ treo tường trôi qua.

Đây có phải là một loại ứng dụng đồng thời / đa luồng / song song không?

Chỉ là một ví dụ, đây là những gì tôi nhận được trên hệ thống Linux của mình khi tôi phát time find .lệnh. Như mong đợi, realthời gian trôi qua lớn hơn nhiều so với những người khác trong quy trình một người dùng / lõi đơn này.

real    0m5.231s
user    0m0.072s
sys     0m0.088s

Nguyên tắc chung là:

  • real <user: Quá trình bị ràng buộc CPU và tận dụng việc thực thi song song trên nhiều lõi / CPU.
  • người dùng thực: Quá trình bị ràng buộc CPU và không tận dụng lợi thế của việc loại bỏ song song.
  • real> user: Quá trình bị ràng buộc I / O. Thực thi trên nhiều lõi sẽ có ít hoặc không có lợi thế.

Tôi không biết nếu avconvđa luồng. Có thể vậy. avconvlà thế hệ mới của ffmpeg. Tôi đã chuyển đổi 7 tệp flv ngắn (mỗi tệp khoảng 20 giây).
kobylecki

thời gian thực thường sẽ lớn hơn hai người kia - nhưng tôi hỏi về tình huống khác
kobylecki

4
Giải thích này là chính xác. Có vẻ như quá trình này đã được chạy trên 4 lõi. Xem thêm giải thích của tôi về siêu phân luồng để biết thêm về cách tính thời gian thực / sys / người dùng. Nó không liên quan chính xác, nhưng các khái niệm là như nhau.
bahamat

@kobylecki thời gian thực ít hơn những người khác vì có vẻ như avconv được chạy trên nhiều lõi. Vì tôi không biết phần mềm đó, cũng như cách nó chạy, tôi không muốn yêu cầu 100%, nhưng đây là giao diện dựa trên thông tin có sẵn (3 dòng đo thời gian và kiến ​​thức: - )
Levon

Trong giá trị findví dụ usrthấp hơn nhiều vì phần lớn thời gian đã bị sử dụng trong thời gian gián đoạn, ngay cả khi findđã được đa luồng thì nó vẫn ở mức thấp (xin lỗi nếu tôi không làm chủ được các thì tiếng Anh).
Emmanuel

13

Chỉ để minh họa những gì đã được nói, với một quá trình hai luồng thực hiện một số tính toán.

/*a.c/*
    #include <pthread.h>
    static void  * dosomething () {
        unsigned long a,b=1;
        for (a=1000000000; a>0; a--) b*=3;
        return NULL;
    }
    main () {
        pthread_t one, two;
        pthread_create(&one,NULL, dosomething, NULL);
        pthread_create(&two,NULL, dosomething, NULL);
        pthread_join (one, NULL);
        pthread_join (two, NULL);
    }
/* end of a.c */

biên dịch

gcc a.c -lpthread

(Đây chỉ là để minh họa, trong đời thực, tôi nên thêm cờ -D_REENTRANT)

$ time ./a.out

real    0m7.415s
user    0m13.105s
sys     0m0.032s

(Thời gian trên Intel Atom có ​​hai lõi chậm :))

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.