몇 가지 다른 조건에서 Linux 쉘에서 무언가를 실행하고 각 실행의 실행 시간을 출력 할 수 있기를 원합니다.
나는 이것을 할 perl 또는 python 스크립트를 작성할 수 있다는 것을 알고 있지만 쉘에서 그것을 할 수있는 방법이 있습니까? (이것은 bash 일 것입니다)
Ticks
창문 케이스와 같은 것을 얻을 수 있습니까?
몇 가지 다른 조건에서 Linux 쉘에서 무언가를 실행하고 각 실행의 실행 시간을 출력 할 수 있기를 원합니다.
나는 이것을 할 perl 또는 python 스크립트를 작성할 수 있다는 것을 알고 있지만 쉘에서 그것을 할 수있는 방법이 있습니까? (이것은 bash 일 것입니다)
Ticks
창문 케이스와 같은 것을 얻을 수 있습니까?
답변:
내장 time
키워드를 사용하십시오 .
$ 도움 시간 시간 : 시간 [-p] PIPELINE PIPELINE을 실행하고 실시간, 사용자 CPU 시간, PIPELINE이 종료 될 때 시스템 CPU 시간을 소비했습니다. 반환 상태는 PIPELINE의 반환 상태입니다. `-p '옵션 타이밍 요약을 약간 다른 형식으로 인쇄합니다. 이것은 사용 출력 형식으로서의 TIMEFORMAT 변수의 값
예:
$ time sleep 2
실제 0m2.009s 사용자 0m0.000s 시스 0m0.004s
time -p i=x; while read line; do x=x; done < /path/to/file.txt
됩니까? while 루프 앞에 아무것도 넣지 않으면 즉시 0.00을 반환합니다.
time
Bash 키워드 로 인해 전체 파이프 라인을 그대로 시간을 정할 수는 있지만 그룹 명령 ( { ...; ...; }
)을 사용하여 여러 명령의 시간을 time -p { i=x; while read line; do x=x; done < /path/to/file.txt; }
type -a time
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 또는 원하는 구문을 사용하여 동일한 작업을 수행 할 수 있습니다. 나는이 기술을 좋아한다.
/usr/bin/time
가 필요 which time
합니다. 그렇지 않으면 달리 실행하더라도 time
쉘 버전을 실행하여 time
인수를 허용하지 않기 때문에 전체 경로 가 필요 합니다 .
env time
:-)
당신은 사용할 수 있습니다 time
및 서브 쉘 ()
:
time (
for (( i=1; i<10000; i++ )); do
echo 1 >/dev/null
done
)
또는 같은 쉘에서 {}
:
time {
for (( i=1; i<10000; i++ )); do
echo 1 >/dev/null
done
}
(
& )
(새로운 컨텍스트, 서브 쉘 )를 사용하고 {
& }
(같은 쉘, 동일한 컨텍스트)를 사용하는 다른 사실이 아닙니다.
방법은
$ > g++ -lpthread perform.c -o per
$ > time ./per
출력은 >>
real 0m0.014s
user 0m0.010s
sys 0m0.002s
-lphtread
또는 -o
태그입니다. time
수락 된 답변이 더 잘 설명되어있는 명령 을 사용해야합니다 .
다른 사용자 요구를 충족시키지 못하는 간단한 방법 중 하나는 쉘 PROMPT를 사용하는 것입니다. 경우에 따라 유용한 간단한 솔루션입니다. 아래 예와 같이 bash 프롬프트 기능을 사용할 수 있습니다.
내보내기 PS1 = '[\ t \ u @ \ h] \ $'
위의 명령은 쉘 프롬프트를 다음과 같이 변경합니다.
[HH : MM : SS username @ hostname] $
쉘 프롬프트로 되돌아가는 명령을 실행하거나 Enter 키를 누를 때마다 프롬프트에 현재 시간이 표시됩니다.
주 :
1) 다음 명령을 입력하기 전에 언젠가 기다렸다면이 시간을 고려해야합니다. 즉, 쉘 프롬프트에 표시된 시간은 명령을 입력 할 때가 아니라 쉘 프롬프트가 표시된 시간 소인입니다. 일부 사용자는 Enter 키를 눌러 다음 명령을 준비하기 전에 새 타임 스탬프가 포함 된 새 프롬프트를 표시합니다.
2) bash 프롬프트를 변경하는 데 사용할 수있는 다른 옵션 및 수정자가 있습니다. 자세한 내용은 (man bash)를 참조하십시오.