스크립트의 실행 시간을 효과적으로 얻는 방법은 무엇입니까?

스크립트의 실행 시간을 효과적으로 얻는 방법은 무엇입니까?

스크립트 완료 시간을 표시하고 싶습니다.

내가 지금 하고 있는 일은 -

#!/bin/bash
date  ## echo the date at start
# the script contents
date  ## echo the date at end

이는 스크립트의 시작 및 종료 시간을 보여줍니다. 프로세서 시간/IO 시간 등 세밀한 출력을 표시할 수 있습니까?

답변1

time스크립트를 호출할 때 사용하세요.

time yourscript.sh

답변2

time옵션이 아닌 경우 ,

start=`date +%s`
stuff
end=`date +%s`

runtime=$((end-start))

또는 1초 미만의 정확도가 필요하고 이를 bc설치 한 경우

start=`date +%s.%N`
stuff
end=`date +%s.%N`

runtime=$( echo "$end - $start" | bc -l )

답변3

그냥 전화해times매개변수 없이 스크립트를 종료합니다.

ksh또는 와 함께 대신 zsh사용할 수도 있습니다 time. 또한 벽시계 시간도 제공됩니다 zsh.time사용자그리고체계CPU 시간.

스크립트의 종료 상태를 유지하려면 다음을 수행할 수 있습니다.

ret=$?; times; exit "$ret"

또는 트랩을 추가할 수도 있습니다 EXIT.

trap times EXIT

이 방법은 쉘이 종료될 때마다 times 가 호출되고 종료 상태가 유지됩니다.

$ bash -c 'trap times EXIT; : {1..1000000}'
0m0.932s 0m0.028s
0m0.000s 0m0.000s
$ zsh -c 'trap time EXIT; : {1..1000000}'
shell  0.67s user 0.01s system 100% cpu 0.677 total
children  0.00s user 0.00s system 0% cpu 0.677 total

또한 bash두 가지 모두 ksh매초 마다 자동으로 증가하는 특수 변수 zsh가 있다는 점에 유의하세요. $SECONDSsums 에서 zshksh93변수는 정밀도를 높이기 위해 부동 소수점 숫자( 사용)로 설정할 수도 있습니다 typeset -F SECONDS. 이는 CPU 시간이 아닌 벽시계 시간일 뿐입니다.

답변4

조금 늦었지만 다른 사람이 검색을 통해 이 스레드를 우연히 발견할 경우를 대비해 내 솔루션(1초 미만의 정확도)을 게시하고 싶었습니다. 출력 형식은 일, 시간, 분, 마지막으로 초입니다.

res1=$(date +%s.%N)

# do stuff in here

res2=$(date +%s.%N)
dt=$(echo "$res2 - $res1" | bc)
dd=$(echo "$dt/86400" | bc)
dt2=$(echo "$dt-86400*$dd" | bc)
dh=$(echo "$dt2/3600" | bc)
dt3=$(echo "$dt2-3600*$dh" | bc)
dm=$(echo "$dt3/60" | bc)
ds=$(echo "$dt3-60*$dm" | bc)

LC_NUMERIC=C printf "Total runtime: %d:%02d:%02d:%02.4f\n" $dd $dh $dm $ds

누군가가 이것이 유용하다고 생각하기를 바랍니다!

[편집] bash printf에서 필드 정의의 모든 문자를 계산해야 합니다. 초를 점 앞의 2자리까지 채우려면 다음과 같이 정의해야 합니다 %07.4f(모든 숫자와 점도 필드 길이로 계산됩니다). , 따라서 행은 다음과 같아야 합니다. LC_NUMERIC=C printf "Total runtime: %d:%02d:%02d:%07.4f\n" $dd $dh $dm $ds

관련 정보