Dlaczego czas rzeczywisty może być krótszy niż czas użytkownika


31

Mam skrypt konwertujący pliki wideo i uruchamiam go na serwerze na danych testowych i mierzę jego czas time. W rezultacie zobaczyłem:

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

Dlaczego czas rzeczywisty jest znacznie krótszy niż czas użytkownika? Czy ma to jakiś związek z wielowątkowością? Czy co jeszcze?

Edycja: I myślę, że skrypt działał około 2m48s


re EDIT - to ma sens, ponieważ realczas jest zegarem ściennym, jak wyjaśniono poniżej (tj. co byśmy zmierzyli, gdybyśmy mieli stoper)
— Levon

Odpowiedzi:


42

Wyświetlane wyniki są nieco dziwne, ponieważ czas rzeczywisty byłby zwykle większy niż pozostałe dwa.

  • Realczas to zegar ścienny. (co możemy zmierzyć stoperem)
  • User czas to czas spędzony w trybie użytkownika w trakcie procesu
  • Sys to czas procesora spędzony w jądrze w procesie.

Tak więc przypuszczam, że jeśli praca byłaby wykonywana jednocześnie przez kilka procesorów, czas procesora byłby dłuższy niż upływ czasu zegara ściennego.

Czy była to aplikacja współbieżna / wielowątkowa / równoległa?

Na przykład to, co otrzymuję w moim systemie Linux po wydaniu time find .polecenia. Zgodnie z oczekiwaniami, realczas, który upłynął, jest znacznie dłuższy niż w pozostałych procesach z jednym użytkownikiem / jednym rdzeniem.

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

Ogólna zasada brzmi:

  • real <użytkownik: proces jest związany z procesorem i wykorzystuje równoległe wykonywanie na wielu rdzeniach / procesorach.
  • rzeczywisty ≈ użytkownik: proces jest związany z procesorem i nie korzysta z równoległego działania.
  • real> user: proces jest związany z operacjami we / wy. Wykonanie na wielu rdzeniach byłoby mało korzystne.

Nie wiem czy avconvjest wielowątkowy. Może być. avconvjest nowa generacja ffmpeg. Konwertowałem 7 krótkich plików flv (około 20 sekund każdy).
— kobylecki

czas rzeczywisty byłby zwykle większy niż pozostałe dwa - ale pytam o inną sytuację
— kobylecki

4
To wyjaśnienie jest poprawne. Wygląda na to, że ten proces został uruchomiony na 4 rdzeniach. Zobacz także moje wyjaśnienie hiperwątkowania, aby dowiedzieć się więcej na temat obliczania czasu rzeczywistego / sys / użytkownika. Nie dotyczy to dokładnie, ale pojęcia są takie same.
— bahamat

@kobylecki w czasie rzeczywistym jest krótszy niż inne, ponieważ wygląda na to, że avconv działa na wielu rdzeniach. Ponieważ nie znam tego oprogramowania ani sposobu jego uruchomienia, nie chcę wysuwać roszczenia w 100%, ale tak to wygląda na podstawie dostępnych informacji (3 linie pomiarów czasu i wiedzy: - )
— Levon,

W tym findprzykładzie usrwartość jest znacznie niższa, ponieważ większość czasu spędzano podczas przerwań, nawet gdyby findbył wielowątkowy, pozostałby na niskim poziomie (przepraszam, jeśli nie opanuję czasów angielskich).
— Emmanuel

13

Aby zilustrować to, co zostało powiedziane, z dwuwątkowymi procesami wykonującymi obliczenia.

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

skompilować

gcc a.c -lpthread

(Aby to zilustrować, w rzeczywistości powinienem był dodać flagę -D_REENTRANT)

$ time ./a.out

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

(Czasy są na Intel Atom, który ma dwa wolne rdzenie :))

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.