Почему реальное время может быть меньше времени пользователя

Почему реальное время может быть меньше времени пользователя

У меня есть скрипт, конвертирующий видеофайлы, и я запускаю его на сервере на тестовых данных и измеряю его время по time. В результате я увидел:

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

Почему реальное время настолько меньше пользовательского? Имеет ли это какое-то отношение к многопоточности? Или к чему-то еще?

Редактировать:И я думаю, что этот сценарий длился около 2 минут 48 секунд.

решение1

Показанный вами вывод немного странный, поскольку реальное время обычно больше двух других.

  • Realвремя - это время на настенных часах (то, что мы можем измерить секундомером)
  • Userвремя — это количество времени, проведенное в пользовательском режиме в рамках процесса
  • Sysвремя ЦП, затрачиваемое ядром в рамках процесса.

Поэтому я предполагаю, что если бы работа выполнялась несколькими процессорами одновременно, время ЦП было бы больше, чем затраченное время настенных часов.

Был ли это тип приложения параллельным/многопоточным/конкурентным?

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

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

Правило большого пальца таково:

  • real < user: Процесс ограничен ЦП и использует преимущества параллельного выполнения на нескольких ядрах/ЦП.
  • real ≈ user: Процесс ограничен процессором и не использует преимущества параллельного выполнения.
  • real > user: Процесс ограничен вводом-выводом. Выполнение на нескольких ядрах не принесет практически никаких преимуществ.

решение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

Связанный контент