временная часть сценария (время выполнения)

#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