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


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 <user: процесс связан с процессором и использует преимущества параллельного выполнения на нескольких ядрах / процессорах.
  • real ≈ user: процесс связан с процессором и не использует преимущества параллельного выполнения.
  • реальный> пользователь: процесс связан с вводом / выводом. Выполнение на нескольких ядрах было бы мало или бесполезно.

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

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

4
Это объяснение верно. Похоже, этот процесс был запущен на 4 ядрах. Смотрите также мое объяснение гиперпоточности для получения дополнительной информации о том, как рассчитывается реальное / sys / пользовательское время. Это не относится точно, но концепции одинаковы.
Багамат

Реальное время @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.