Как интерпретировать время & ldquo; real & rdquo ;, & ldquo; user & rdquo; и & ldquo; sys & rdquo;

Введение

Я тщательно настраивал код, чтобы сократить обработку с 30 секунд до секунды в разных частях моей программы bash. У меня возникли проблемы с тем, что команда time работает, когда она сообщает переменные real, user и sys.

У меня есть этот код:

echo " " echo "Time to build DirsNdxArr from DirsArr $DirsArrCnt elements:" DirsArrCnt=${#DirsArr[@]} time for (( i=1; i<$DirsArrCnt; i=i+$DaElementCnt )); do DirsNdxArr["${DirsArr[$i]}"]=$i AllItemSizes=$(( $AllItemSizes + ${DirsArr[$(( $i + $ColFileSizes - 1 ))]} )) done echo " " echo "Time to build FilesNdxArr from FilesArr $FilesArrCnt elements:" FilesArrCnt=${#FilesArr[@]} time for (( i=0; i<$FilesArrCnt; i=i+$FaElementCnt )); do FilesNdxArr["${FilesArr[$i]}"]=$i AllTagSizes=$(( $AllTagSizes + ${FilesArr[$(( $i + $FaColFileSizes ))]} )) done

Сообщает об этом:

Time to build DirsNdxArr from DirsArr 56700 elements: real 0m0.149s user 0m0.149s sys 0m0.000s Time to build FilesNdxArr from FilesArr 390 elements: real 0m0.002s user 0m0.002s sys 0m0.000s

Почему sys время сообщается о нуле?

Интерпретация вывода команды time builtin будет предполагать, что система делает

ps Я знаю, что \n может использоваться как новая строка для echo с параметром -e. Моя привычка состоит в том, чтобы принести в жертву одну ласковость и банальные аргументы в пользу удобочитаемости.

0
задан 1 June 2017 в 04:35

2 ответа

Короче говоря, это просто означает, что ваша программа не запрашивала выполнение каких-либо привилегированных задач, поэтому процессор не тратит время в режиме привилегированного (ядра).

Основы First

Прежде всего, вам нужно понять несколько вещей, чтобы правильно интерпретировать вывод time:

, с которым вы выполняете команду time (потому что существует несколько) значение каждое поле и каждое из них означает (дополнительное чтение здесь) разницу между ядром и пользовательским режимом

Существует команда time для двух типов. Есть встроенная оболочка и есть /usr/bin/time. Встроенная оболочка - это та, которую вы используете, и по умолчанию она отображает 3 строки, real, user и sys. В руководстве для time также упоминается эта же форма вывода:

-p, --portability Use the following format string, for conformance with POSIX standard 1003.2: real %e user %U sys %S

И если вы проверите раздел «ФОРМАТИРОВАТЬ ВЫХОД», мы имеем:

E Elapsed real (wall clock) time used by the process, in [hours:]minutes:seconds. U Total number of CPU-seconds that the process used directly (in user mode), in seconds. S Total number of CPU-seconds used by the system on behalf of the process (in kernel mode), in seconds.

Из всей этой информации мы можем собрать, что есть два режима, в которых процессор может работать - режим пользователя и режим ядра, а команда time показывает, как долго процессор остается в заданном режиме делать то, что ваша программа / приложение запрашивала у ЦП.

Понимание того, что представляет собой отчет времени sys и что означает значение 0

ОК, поэтому мы понимаем разницу в том, что есть режим пользователя и режим ядра, в котором может работать код. Мы уже можем понять, что это в основном означает, что программа не использовала режим ядра для выполнения некоторых задач. Что это значит?

Обратитесь к этому сообщению:

В режиме ядра исполняемый код имеет полный и неограниченный доступ к базовому оборудованию. Он может выполнять любую инструкцию CPU и ссылаться на любой адрес памяти.

И из другого ответа в том же сообщении:

В режиме ядра исполняемый код имеет полный и неограниченный доступ к базовому оборудованию. Он может выполнять любую инструкцию процессора и ссылаться на любой адрес памяти.

Переключение с пользовательского режима на режим ядра не выполняется автоматически с помощью CPU. Процессор прерывается прерываниями (таймеры, клавиатура, ввод-вывод). Когда происходит прерывание, CPU прекращает выполнение текущей запущенной программы, переключается в режим ядра, выполняет обработчик прерываний. Этот обработчик сохраняет состояние процессора, выполняет его операции, восстанавливает состояние и возвращается в пользовательский режим.

Таким образом, это означает, что ваш выход - не было переключения в режим ядра, а CPU не получал никаких прерываний от программа для этого. Это также означает, что ваш код не имеет ничего, что требовало бы повышенных привилегий от CPU

3
ответ дан 18 July 2018 в 12:23

Короче говоря, это просто означает, что ваша программа не запрашивала выполнение каких-либо привилегированных задач, поэтому процессор не тратит время в режиме привилегированного (ядра).

Основы First

Прежде всего, вам нужно понять несколько вещей, чтобы правильно интерпретировать вывод time:

, с которым вы выполняете команду time (потому что существует несколько) значение каждое поле и каждое из них означает (дополнительное чтение здесь) разницу между ядром и пользовательским режимом

Существует команда time для двух типов. Есть встроенная оболочка и есть /usr/bin/time. Встроенная оболочка - это та, которую вы используете, и по умолчанию она отображает 3 строки, real, user и sys. В руководстве для time также упоминается эта же форма вывода:

-p, --portability Use the following format string, for conformance with POSIX standard 1003.2: real %e user %U sys %S

И если вы проверите раздел «ФОРМАТИРОВАТЬ ВЫХОД», мы имеем:

E Elapsed real (wall clock) time used by the process, in [hours:]minutes:seconds. U Total number of CPU-seconds that the process used directly (in user mode), in seconds. S Total number of CPU-seconds used by the system on behalf of the process (in kernel mode), in seconds.

Из всей этой информации мы можем собрать, что есть два режима, в которых процессор может работать - режим пользователя и режим ядра, а команда time показывает, как долго процессор остается в заданном режиме делать то, что ваша программа / приложение запрашивала у ЦП.

Понимание того, что представляет собой отчет времени sys и что означает значение 0

ОК, поэтому мы понимаем разницу в том, что есть режим пользователя и режим ядра, в котором может работать код. Мы уже можем понять, что это в основном означает, что программа не использовала режим ядра для выполнения некоторых задач. Что это значит?

Обратитесь к этому сообщению:

В режиме ядра исполняемый код имеет полный и неограниченный доступ к базовому оборудованию. Он может выполнять любую инструкцию CPU и ссылаться на любой адрес памяти.

И из другого ответа в том же сообщении:

В режиме ядра исполняемый код имеет полный и неограниченный доступ к базовому оборудованию. Он может выполнять любую инструкцию процессора и ссылаться на любой адрес памяти.

Переключение с пользовательского режима на режим ядра не выполняется автоматически с помощью CPU. Процессор прерывается прерываниями (таймеры, клавиатура, ввод-вывод). Когда происходит прерывание, CPU прекращает выполнение текущей запущенной программы, переключается в режим ядра, выполняет обработчик прерываний. Этот обработчик сохраняет состояние процессора, выполняет его операции, восстанавливает состояние и возвращается в пользовательский режим.

Таким образом, это означает, что ваш выход - не было переключения в режим ядра, а CPU не получал никаких прерываний от программа для этого. Это также означает, что ваш код не имеет ничего, что требовало бы повышенных привилегий от CPU

3
ответ дан 24 July 2018 в 19:57
  • 1
    Там будут некоторые переключатели (для выделения памяти - но это, как правило, очень быстро). – muru 1 June 2017 в 04:42

Другие вопросы по тегам:

Похожие вопросы: