Чому реальний час може бути меншим, ніж час користувача


31

У мене є сценарій для перетворення відео-файлів, і я запускаю його на сервері на тестових даних і вимірюю його час time. В результаті я побачив:

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

Чому в режимі реального часу набагато менше, ніж у користувачів? Чи має це зв’язок багатопотокове читання? Або що ще?

Редагувати: І я думаю, що цей сценарій працював близько 2m48s


Повторне редагування - це має ідеальний сенс, оскільки realчас - це годинник настінних годин, як пояснено нижче (тобто, що ми могли б виміряти, якщо б у нас було секундомір)
Левон

Відповіді:


42

Вихід, який ви показуєте, трохи дивний, оскільки в реальному часі зазвичай більший, ніж у двох інших.

  • Realчас - це настінний годинник. (що ми могли виміряти секундоміром)
  • User час - це кількість часу, проведеного в режимі користувача в межах процесу
  • Sys - це витрачений час процесора в ядрі в процесі.

Тому я припускаю, що якщо робота виконувалась декількома процесорами одночасно, час процесора був би більшим за минулий час настінного годинника.

Це був паралельний / багатопотоковий / паралельний тип додатків?

Як приклад, ось що я отримую в моїй системі Linux, коли видаю time find .команду. Як очікувалося, минулий realчас значно більший, ніж інші для цього одного користувача / одноядерного процесу.

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

Правило:

  • real <користувач: Процес пов'язаний з процесором і використовує переваги паралельного виконання на декількох ядрах / процесорах.
  • реальний ≈ користувач: процес пов'язаний з процесором і не використовує переваг паралельного виконання.
  • real> користувач: процес пов'язаний введення-виводу. Виконання на декількох ядрах мало б користі.

Я не знаю, чи avconvє багатопотокова. Це може бути. avconvце нове покоління ffmpeg. Я перетворював 7 коротких файлів flv (приблизно 20 секунд у кожному).
кобилецькі

реальний час зазвичай буде більшим, ніж інші два - але я запитую про іншу ситуацію
kobylecki

4
Це пояснення правильне. Схоже, цей процес був запущений на 4 ядрах. Докладніше про те, як обчислюється реальний / sys / користувальницький час, дивіться також моє пояснення Hyperthreading . Це не стосується точно, але поняття однакові.
bahamat

@kobylecki в реальному часі менше інших, тому що схоже, що avconv працює на декількох ядрах. Оскільки я не знаю, що програмне забезпечення, а також як воно було запущене, я не хочу заявляти 100% претензії, але це виглядає так, виходячи з наявної інформації (3 рядки вимірювання часу та знання: - )
Левон

У findприкладі usrзначення набагато нижче, тому що більшість часу було витрачено під час перерв, навіть якби findбуло багатопотокове, воно залишилося б низьким (вибачте, якщо я не опановую англійські моменти).
Еммануїл

13

Просто для ілюстрації того, що було сказано, з двома потоковими процесами роблять деякий розрахунок.

/*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, який має два повільних ядра :))

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.