為什麼即時時間會低於使用者時間

為什麼即時時間會低於使用者時間

我有一個轉換視訊檔案的腳本,我在伺服器上根據測試資料運行它並通過 測量其時間time。結果我看到:

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

為什麼即時時間比使用者時間低很多?這和多執行緒有什麼關係嗎?或者還有什麼?

編輯:我認為該腳本運行了大約 2 分 48 秒

答案1

您顯示的輸出有點奇怪,因為即時通常會比其他兩個更大。

  • Real時間是掛鐘時間。 (我們可以用秒錶測量)
  • Usertime 是進程內使用者模式所花費的時間量
  • Sys是進程內核心花費的 CPU 時間。

所以我想如果工作是由多個處理器同時完成的,CPU 時間將高於所使用的掛鐘時間。

這是並發/多執行緒/並行類型的應用程式嗎?

舉個例子,這是我發出指令時在 Linux 系統上得到的結果time find .。正如預期的那樣,real在這個單一用戶/單核心進程上,所花費的時間比其他進程要長得多。

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

經驗法則是:

  • real < user:進程受 CPU 限制,並利用多核心/CPU 上的平行執行。
  • real ≈ user:此程序受 CPU 限制,且不利用並行執行。
  • real > user:流程受 I/O 限制。在多個核心上執行幾乎沒有優勢。

答案2

只是為了說明所說的內容,用兩個執行緒進程進行一些計算。

/*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 */

編譯

gcc a.c -lpthread

(這只是為了說明,在現實生活中我應該添加 -D_REENTRANT 標誌)

$ time ./a.out

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

(時間是在具有兩個慢速核心的 Intel Atom 上:))

答案3

它不需要是多線程程序;您可以透過多個進程獲得相同的效果。我寫了一個 C 程式來進行一些簡單的數字運算:

$ time ./runner

real    1m12.746s
user    1m12.493s
sys     0m0.015s

然後我編寫了一個腳本來運行該進程的兩個副本:

$ cat run_script
#!/bin/sh
./runner &
./runner &
wait

$ time ./run_script

real    1m31.231s
user    3m0.538s
sys     0m0.215s

答案4

正如萊文所說:

我有一個 i7(8 個處理器),所以如果運行bash

$ time for ((i=0;i<1000000;i++)); do echo $i; done | wc -l
1000000

real    0m4,878s
user    0m4,368s
sys     0m3,083s

然後如果將 bash 限制為一個進程taskset -cp 0 $BASHPID

$ taskset -cp 0 $BASHPID                                                                                         
pid 30551's current affinity list: 0-7
pid 30551's new affinity list: 0

現在的結果是

$ time for ((i=0;i<1000000;i++)); do echo $i; done | wc -l
1000000

real    0m7,120s
user    0m4,282s
sys     0m2,824s

https://www.looklinux.com/how-to-run-process-or-program-on-specific-cpu-cores-in-linux/

http://man7.org/linux/man-pages/man1/time.1.html

相關內容