#linux #bash #time #milliseconds #seconds
#linux #bash #время #миллисекунды #секунды
Вопрос:
С time script.sh
помощью вы получите время, необходимое для запуска скрипта, НО если вы хотите выделить время для части скрипта?
допустим, я хочу проверить, сколько времени занимает цикл, я мог бы использовать функцию $ SECONDS, но есть ли какой-либо таймер, который считает миллисекунды?
например, в середине длинного кода:
timerstart
until [[ $loop -eq 10000 ]]; do
(( loop))
echo "annoying"
done
timerstop
а затем в конце скрипта я просто добавляю echo $timerresult
, и он отобразит, сколько миллисекунд потребовалось для запуска только выбранного кода, а не остальной части скрипта
Я ищу это решение, чтобы я мог протестировать части скриптов на «медлительность» .. возможно ли это решить?
Ответ №1:
Для версии Bash 5.0 и более поздних версий вы можете использовать $EPOCHREALTIME
:
[…] он расширяется до количества секунд, прошедших с эпохи Unix, как значение с плавающей запятой с детализацией в микросекунды […]
start=$EPOCHREALTIME
for ((i = 0; i < 10000; i)); do
echo "annoying"
done
stop=$EPOCHREALTIME
elapsed=$(bc -l <<< "$stop - $start")
Комментарии:
1. Было много хороших предложений, но я думаю, что ваше лучше всего соответствует моим потребностям, потому что с этим вы можете использовать несколько функций в скрипте (с несколькими начальными / конечными точками и впоследствии просматривать результаты, поэтому, внедрив вашу идею и запустив скрипт,
time script.sh
я получу как полное время, так и время разных циклови наполняет!
Ответ №2:
Вы можете использовать
date ' %s.%N'
чтобы получить текущее время с точностью до наносекунды.
#!/bin/bash
start=$(date ' %s.%N')
until [[ $loop -eq 10000 ]]; do
(( loop))
echo "annoying"
done
stop=$(date ' %s.%N')
bc <<< $stop-$start
Ответ №3:
Вы также можете использовать time
в скрипте для отдельных частей, например, для определения времени цикла:
time until [[ $loop -eq 10000 ]]; do
(( loop))
echo "annoying"
done
или с помощью группы фигурных скобок для определения времени выполнения группы команд:
time {
until [[ $loop -eq 10000 ]]; do
(( loop))
done
echo "Other commands here that are also timed"
}
Ответ №4:
Поместите цикл в функцию.
#!/bin/bash
myloop() {
loop=1
until [[ $loop -eq 10000 ]]; do
(( loop))
echo "annoying"
done
}
time myloop