[linux] 쉘에서 프로그램 실행 시간 가져 오기
몇 가지 다른 조건에서 Linux 쉘에서 무언가를 실행하고 각 실행의 실행 시간을 출력 할 수 있기를 원합니다.
나는 이것을 할 perl 또는 python 스크립트를 작성할 수 있다는 것을 알고 있지만 쉘에서 그것을 할 수있는 방법이 있습니까? (이것은 bash 일 것입니다)
답변
내장 time
키워드를 사용하십시오 .
$ 도움 시간 시간 : 시간 [-p] PIPELINE PIPELINE을 실행하고 실시간, 사용자 CPU 시간, PIPELINE이 종료 될 때 시스템 CPU 시간을 소비했습니다. 반환 상태는 PIPELINE의 반환 상태입니다. `-p '옵션 타이밍 요약을 약간 다른 형식으로 인쇄합니다. 이것은 사용 출력 형식으로서의 TIMEFORMAT 변수의 값
예:
$ time sleep 2
실제 0m2.009s 사용자 0m0.000s 시스 0m0.004s
답변
time (1)을time
사용하여 bash 내장 (Robert Robert가 언급 한 것) 보다 훨씬 자세한 정보를 얻을 수 있습니다 . 일반적으로 이것은입니다 ./usr/bin/time
편집자 주 : 쉘의 키워드가 아닌 외부 유틸리티 를 호출하려면 이를로 호출하십시오 . A는 POSIX 위임 유틸리티 하지만 지원하는 데 필요한 유일한 옵션이다 .
: 특정 플랫폼은 특정 비표준 확장 구현 과 작품 GNU 의 (질문이 태그가 아래에서 입증 된 바와 같이, 유틸리티를time
time
/usr/bin/time
time
-p
-v
time
리눅스); BSD / macOS 구현은 -l
비슷한 출력을 생성 하는 데 사용 합니다 man 1 time
.
자세한 출력 예 :
$ /usr/bin/time -v sleep 1
Command being timed: "sleep 1"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 1%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.05
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 0
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 210
Voluntary context switches: 2
Involuntary context switches: 1
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
답변
#!/bin/bash
START=$(date +%s)
# do something
# start your script work here
ls -R /etc > /tmp/x
rm -f /tmp/x
# your logic ends here
END=$(date +%s)
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"
답변
라인 별 델타 측정의 경우 gnomon을 시도하십시오 .
타임 스탬프 정보를 다른 명령의 표준 출력에 추가하기위한 명령 줄 유틸리티 (moreutils의 ts와 약간 비슷 함). 오래 걸리는 것에 대한 역사적 기록을 원하는 장기 실행 프로세스에 유용합니다.
--high
및 / 또는 --medium
옵션을 사용하여 gnomon이 타임 스탬프를 빨간색 또는 노란색으로 강조 표시하는 길이 임계 값을 초 단위로 지정할 수 있습니다 . 그리고 다른 것들도 할 수 있습니다.
답변
더 정확한 결과를 원하면 %N
with를 사용하십시오 date
( 정수만 처리 bc
하기 때문에 diff에 사용 하십시오 $(())
).
방법은 다음과 같습니다.
start=$(date +%s.%N)
# do some stuff here
dur=$(echo "$(date +%s.%N) - $start" | bc)
printf "Execution time: %.6f seconds" $dur
예:
start=$(date +%s.%N); \
sleep 0.1s; \
dur=$(echo "$(date +%s.%N) - $start" | bc); \
printf "Execution time: %.6f seconds\n" $dur
결과:
Execution time: 0.104623 seconds
답변
나중에 계산에 시간을 사용하려는 경우 시간 을 절약하는 코드 를 출력 하는 -f
옵션 을 사용하는 방법을 배우십시오 . 다음은 최근에 전체 클래스의 학생 프로그램의 실행 시간을 얻고 정렬하는 데 사용한 몇 가지 코드입니다./usr/bin/time
fmt="run { date = '$(date)', user = '$who', test = '$test', host = '$(hostname)', times = { user = %U, system = %S, elapsed = %e } }"
/usr/bin/time -f "$fmt" -o $timefile command args...
나중에 모든 $timefile
파일을 연결 하고 출력을 Lua 인터프리터 로 파이프합니다 . Python 또는 bash 또는 원하는 구문을 사용하여 동일한 작업을 수행 할 수 있습니다. 나는이 기술을 좋아한다.
답변
$SECONDS
초 단위의 정밀도 만 필요한 경우 내장 변수를 사용 하면 셸이 실행 된 시간 (초)을 계산합니다.
while true; do
start=$SECONDS
some_long_running_command
duration=$(( SECONDS - start ))
echo "This run took $duration seconds"
if some_condition; then break; fi
done