스크립트 완료 시간을 표시하고 싶습니다.
내가 현재하는 일은-
#!/bin/bash
date ## echo the date at start
# the script contents
date ## echo the date at end
이것은 단지 스크립트의 시작과 끝 시간을 보여줍니다. 프로세서 시간 / IO 시간 등과 같이 미세한 출력을 표시 할 수 있습니까?
스크립트 완료 시간을 표시하고 싶습니다.
내가 현재하는 일은-
#!/bin/bash
date ## echo the date at start
# the script contents
date ## echo the date at end
이것은 단지 스크립트의 시작과 끝 시간을 보여줍니다. 프로세서 시간 / IO 시간 등과 같이 미세한 출력을 표시 할 수 있습니까?
답변:
time
스크립트를 호출 할 때 사용 하십시오.
time yourscript.sh
time $( ... ) >> out.txt
time (command1 && command2)
time
옵션이 아닌 경우
start=`date +%s`
stuff
end=`date +%s`
runtime=$((end-start))
date
예를 들어, 두 번, 그래서 당신은에서 수있는 최고의 아마 덜 실제로는 밀리 초 정밀도를 얻을 수 등), 사용해보십시오 date +%s.%N
. ( %N
전체 초 이후의 나노초입니다.)
date +%s%N
하거나 bc
jwchew가 제안한 두 값에서 실제 런타임을 계산하는 데 더 유용한 것을 사용하십시오. 아직도, 나는이 접근법이 최선의 방법이라고 생각합니다. time
위에서 설명한 이유로 사용 가능한 경우 훨씬 더 좋습니다.
bc
하고이 수행runtime=$( echo "$end - $start" | bc -l )
echo "Duration: $((($(date +%s)-$start)/60)) minutes
그냥 전화 times
스크립트를 끝낼 때 인수없이.
로 ksh
또는 zsh
, 당신은 또한 사용할 수 있습니다 time
대신. 로 zsh
, time
또한뿐만 아니라 당신에게 벽 시계 시간을 줄 것이다 사용자 및 시스템 CPU 시간.
스크립트의 종료 상태를 유지하려면 다음을 수행하십시오.
ret=$?; times; exit "$ret"
또는 트랩을 추가 할 수도 있습니다 EXIT
.
trap times EXIT
이렇게하면 쉘이 종료 될 때마다 시간이 호출되고 종료 상태가 유지됩니다.
$ 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
자동으로 매초마다 증가됩니다 특별한 변수. 모두에서 zsh
하고 ksh93
, 그 변수는 부동 소수점 (과를 만들 수 있습니다 typeset -F SECONDS
더 정밀도를 얻기 위해). 이것은 CPU 시간이 아닌 벽시계 시간입니다.
time
방식은 이전에 제시된 접근 방식과 거의 같습니다 . timeit
MATLAB 코드로 제시된 접근법이 여기서 유용 할 수 있다고 생각합니다 .
times
벽에 걸리지 않는다는 것을 알았 습니다. 예 :bash -c 'trap times EXIT;sleep 2'
나는 밴드 왜건에 약간 늦었지만 다른 사람들이 검색을 통해이 스레드를 우연히 발견 할 수 있도록 내 솔루션 (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)
printf "Total runtime: %d:%02d:%02d:%02.4f\n" $dd $dh $dm $ds
누군가가 이것이 유용하다는 것을 알기를 바랍니다!
date
는 1 초 미만의 정밀도를 지원하지 않으며 N
타임 스탬프에 리터럴“ ” 만 추가 합니다.
dt2=$(echo "$dt%86400" | bc)
. 그냥 말하기 ... BTW 나는 양식을 선호 dt2=$(bc <<< "${dt}%86400")
하지만 그것은 전적으로 개인적입니다.
내 방법 bash
:
# Reset BASH time counter
SECONDS=0
#
# do stuff
#
ELAPSED="Elapsed: $(($SECONDS / 3600))hrs $((($SECONDS / 60) % 60))min $(($SECONDS % 60))sec"
#!/bin/bash
start=$(date +%s.%N)
# HERE BE CODE
end=$(date +%s.%N)
runtime=$(python -c "print(${end} - ${start})")
echo "Runtime was $runtime"
예, 이것은 Python을 호출하지만 그와 함께 살 수 있다면 이것은 아주 훌륭하고 간결한 솔루션입니다.
python
서브 쉘에서 해당 명령 을 실행 하고 출력을 읽는 데 대부분의 최신 시스템에서 수백만 나노초가 소요 된다는 점에 유의하십시오 . 실행과 동일합니다 date
.
이 질문은 꽤 오래되었지만 내가 좋아하는 방법을 찾으려고 노력 하면서이 스레드가 높아졌습니다 ... 그리고 아무도 그것을 언급하지 않은 것에 놀랐습니다.
perf stat -r 10 -B sleep 1
'perf'는 커널의 'tools / perf'에 포함 된 성능 분석 도구이며 별도의 패키지 (CentOS의 'perf'및 Debian / Ubuntu의 'linux-tools')로 설치하는 경우가 종종 있습니다. Linux Kernal perf Wiki 에는 이에 대한 자세한 정보가 있습니다.
'perf stat'를 실행하면 마지막에 평균 실행 시간을 포함하여 상당히 많은 세부 정보가 제공됩니다.
1.002248382 seconds time elapsed ( +- 0.01% )
perf
?
perf stat
이제 "통계 수집 권한이 없을 수 있습니다." 를 사용하여 일부 명령을 실행 sudo
하지 않으면 대상 시스템을 완전히 소유하지 않은 모든 시나리오에서 쓸모가 없습니다.
명령 전에 시간을 측정하기 위해 추가 할 수있는 작은 쉘 기능 :
tm() {
s=$(date +%s)
$@
rc=$?
echo "took $[$(date +%s)-$s] seconds. return code $rc" >&2
return $rc
}
그런 다음 스크립트 또는 명령 행에서 다음과 같이 사용하십시오.
tm the_original_command with all its parameters
s=$(date +%s000)
. 작동하는지 확실하지 않습니다.
#!/bin/csh
#PBS -q glean
#PBS -l nodes=1:ppn=1
#PBS -l walltime=10:00:00
#PBS -o a.log
#PBS -e a.err
#PBS -V
#PBS -M shihcheng.guo@gmail.com
#PBS -m abe
#PBS -A k4zhang-group
START=$(date +%s)
for i in {1..1000000}
do
echo 1
done
END=$(date +%s)
DIFF=$(echo "$END - $START" | bc)
echo "It takes DIFF=$DIFF seconds to complete this task..."
date
스크립트 전후에 어떤 용도로 사용하여 이미 주어진 다른 답변 과 어떻게 다른가요?
bash 만 사용 하면 쉘 스크립트의 일부 (또는 전체 스크립트의 경과 시간)에 대한 지속 시간 을 측정하고 계산할 수도 있습니다 .
start=$SECONDS
... # do time consuming stuff
end=$SECONDS
이제 차이점을 인쇄 할 수 있습니다.
echo "duration: $((end-start)) seconds."
증분 기간 만 필요한 경우 다음을 수행하십시오.
echo "duration: $((SECONDS-start)) seconds elapsed.."
기간을 변수에 저장할 수도 있습니다.
let diff=end-start
에 기반한 타이밍 기능 SECONDS
은 2 차 수준의 입도로만 제한되며 외부 명령을 사용하지 않습니다.
time_it() {
local start=$SECONDS ts ec
printf -v ts '%(%Y-%m-%d_%H:%M:%S)T' -1
printf '%s\n' "$ts Starting $*"
"$@"; ec=$?
printf -v ts '%(%Y-%m-%d_%H:%M:%S)T' -1
printf '%s\n' "$ts Finished $*; elapsed = $((SECONDS-start)) seconds"
# make sure to return the exit code of the command so that the caller can use it
return "$ec"
}
예를 들면 다음과 같습니다.
time_it sleep 5
준다
2019-03-30_17:24:37 Starting sleep 5 2019-03-30_17:24:42 Finished
sleep 5; elapsed = 5 seconds