Как интерпретировать “реальное” время, “пользователь” и “sys”

Введение

Я подстраивал код для сокращения обработки от 30 секунд менее чем до секунды в различных частях моей программы удара. Я испытываю затруднения при обертывании моего ума о как 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 встроенная команда можно было бы принять систему, делает только, конечно, это не то, что происходит?

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

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

1 ответ

Короче говоря, это просто означает, что Ваша программа не запрашивала выполнить любые привилегированные задачи, следовательно ЦП имеет, не проводят времени в привилегированном (ядро) режим.

Основы сначала

В первую очередь, существует несколько вещей, которые необходимо понять для интерпретации вывода 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

И если Вы проверяете раздел "FORMATTING THE OUTPUT", мы имеем:

         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 средних значений

Хорошо, таким образом, мы понимаем, что различие - то, что существует непривилегированный режим и привилегированный режим, в котором может работать код. Мы уже можем полагать, что это в основном означает, что программа не использовала привилегированный режим для выполнения некоторых задач. Что это на самом деле означает?

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

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

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

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

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

Примечание: это, вероятно, должно быть перефразировано как "не было никакого длинного/примечательного переключателя в привилегированный режим", начиная с выделения памяти с чем-то как malloc() функция в C потребовала бы переключения в привилегированный режим, но это микроскопические переключатели, которые мы должны были бы действительно исследовать с отладчиком или strace команда.

4
ответ дан 2 December 2019 в 02:14

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

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