Я тщательно настраивал код, чтобы сократить обработку с 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
Интерпретация вывода команды time builtin будет предполагать, что система делает
ps Я знаю, что \n может использоваться как новая строка для echo с параметром -e. Моя привычка состоит в том, чтобы принести в жертву одну ласковость и банальные аргументы в пользу удобочитаемости.
Короче говоря, это просто означает, что ваша программа не запрашивала выполнение каких-либо привилегированных задач, поэтому процессор не тратит время в режиме привилегированного (ядра).
Прежде всего, вам нужно понять несколько вещей, чтобы правильно интерпретировать вывод 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 показывает, как долго процессор остается в заданном режиме делать то, что ваша программа / приложение запрашивала у ЦП.
ОК, поэтому мы понимаем разницу в том, что есть режим пользователя и режим ядра, в котором может работать код. Мы уже можем понять, что это в основном означает, что программа не использовала режим ядра для выполнения некоторых задач. Что это значит?
Обратитесь к этому сообщению:
В режиме ядра исполняемый код имеет полный и неограниченный доступ к базовому оборудованию. Он может выполнять любую инструкцию CPU и ссылаться на любой адрес памяти.И из другого ответа в том же сообщении:
В режиме ядра исполняемый код имеет полный и неограниченный доступ к базовому оборудованию. Он может выполнять любую инструкцию процессора и ссылаться на любой адрес памяти.
Переключение с пользовательского режима на режим ядра не выполняется автоматически с помощью CPU. Процессор прерывается прерываниями (таймеры, клавиатура, ввод-вывод). Когда происходит прерывание, CPU прекращает выполнение текущей запущенной программы, переключается в режим ядра, выполняет обработчик прерываний. Этот обработчик сохраняет состояние процессора, выполняет его операции, восстанавливает состояние и возвращается в пользовательский режим.
Таким образом, это означает, что ваш выход - не было переключения в режим ядра, а CPU не получал никаких прерываний от программа для этого. Это также означает, что ваш код не имеет ничего, что требовало бы повышенных привилегий от CPU
Короче говоря, это просто означает, что ваша программа не запрашивала выполнение каких-либо привилегированных задач, поэтому процессор не тратит время в режиме привилегированного (ядра).
Прежде всего, вам нужно понять несколько вещей, чтобы правильно интерпретировать вывод 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 показывает, как долго процессор остается в заданном режиме делать то, что ваша программа / приложение запрашивала у ЦП.
ОК, поэтому мы понимаем разницу в том, что есть режим пользователя и режим ядра, в котором может работать код. Мы уже можем понять, что это в основном означает, что программа не использовала режим ядра для выполнения некоторых задач. Что это значит?
Обратитесь к этому сообщению:
В режиме ядра исполняемый код имеет полный и неограниченный доступ к базовому оборудованию. Он может выполнять любую инструкцию CPU и ссылаться на любой адрес памяти.И из другого ответа в том же сообщении:
В режиме ядра исполняемый код имеет полный и неограниченный доступ к базовому оборудованию. Он может выполнять любую инструкцию процессора и ссылаться на любой адрес памяти.
Переключение с пользовательского режима на режим ядра не выполняется автоматически с помощью CPU. Процессор прерывается прерываниями (таймеры, клавиатура, ввод-вывод). Когда происходит прерывание, CPU прекращает выполнение текущей запущенной программы, переключается в режим ядра, выполняет обработчик прерываний. Этот обработчик сохраняет состояние процессора, выполняет его операции, восстанавливает состояние и возвращается в пользовательский режим.
Таким образом, это означает, что ваш выход - не было переключения в режим ядра, а CPU не получал никаких прерываний от программа для этого. Это также означает, что ваш код не имеет ничего, что требовало бы повышенных привилегий от CPU