![스크립트의 실행 시간을 효과적으로 얻는 방법은 무엇입니까?](https://linux55.com/image/26593/%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98%20%EC%8B%A4%ED%96%89%20%EC%8B%9C%EA%B0%84%EC%9D%84%20%ED%9A%A8%EA%B3%BC%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EC%96%BB%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
스크립트 완료 시간을 표시하고 싶습니다.
내가 지금 하고 있는 일은 -
#!/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
가 있다는 점에 유의하세요. $SECONDS
sums 에서 zsh
이 ksh93
변수는 정밀도를 높이기 위해 부동 소수점 숫자( 사용)로 설정할 수도 있습니다 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