[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 의 (질문이 태그가 아래에서 입증 된 바와 같이, 유틸리티를timetime /usr/bin/time
time-p
-vtime); 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이 타임 스탬프를 빨간색 또는 노란색으로 강조 표시하는 길이 임계 값을 초 단위로 지정할 수 있습니다 . 그리고 다른 것들도 할 수 있습니다.

예


답변

더 정확한 결과를 원하면 %Nwith를 사용하십시오 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