다른 쉘 간의 스크립트 실행 시간을 비교하기 위해 일부 SE 답변에서는 bash
's내장 time
명령은 다음과 같습니다:
time bash -c 'foo.sh'
time dash -c 'foo.sh'
...등, 테스트할 각 쉘에 대해. 이러한 벤치마크는 각 셸을 로드하고 초기화하는 데 필요한 시간을 없앨 수 없습니다.그 자체. 예를 들어, 위의 두 명령이 모두 다음 위치에 저장되어 있다고 가정합니다.플로피 디스크 읽기 속도가 초기인 느린 장치, (124KB/초), dash
(~150K실행 파일)은 대략 로드됩니다.7배보다 빠른 bash
(~100만), 셸 로드 시간은 time
숫자를 왜곡합니다. 이러한 셸의 사전 로드 시간 foo.sh
은 각 셸에서 실행 시간을 측정하는 것과 관련이 없습니다.뒤쪽에쉘이 로드됩니다.
스크립트 타이밍을 실행하는 데 가장 적합한 이식 가능하고 일반적인 유틸리티는 무엇입니까?이내에각 껍질? 따라서 위의 코드는 다음과 같습니다.
bash -c 'general_timer_util foo.sh'
dash -c 'general_timer_util foo.sh'
참고: 쉘 없음내장 time
단일 명령은 이식 가능하거나 보편적이지 않기 때문입니다.
util이 셸의 내부 명령과 파이프에 소요되는 시간을 벤치마킹할 수 있다면 좋을 것입니다. 그러면 사용자가 먼저 이를 스크립트로 래핑할 필요가 없습니다. 다음과 같은 인공 구문이 도움이 될 것입니다.
general_timer_util "while read x ; do echo x ; done < foo"
time
이 문제를 해결할 수 있는 쉘이 있습니다 . 작품 등 bash -c "time while false ; do : ; done"
. 시스템에서 작동하는 것과 작동하지 않는 것을 확인하려면 다음을 시도하십시오.
tail +2 /etc/shells |
while read s ; do
echo $s ; $s -c "time while false ; do : ; done" ; echo ----
done
답변1
주의하셔야 할 점은time
POSIX에 의해 지정됨, 그리고 AFAICT POSIX 언급된 유일한 옵션( -p
)은 다양한 쉘에서 올바르게 지원됩니다.
$ bash -c 'time -p echo'
real 0.00
user 0.00
sys 0.00
$ dash -c 'time -p echo'
real 0.01
user 0.00
sys 0.00
$ busybox sh -c 'time -p echo'
real 0.00
user 0.00
sys 0.00
$ ksh -c 'time -p echo'
real 0.00
user 0.00
sys 0.00
답변2
나는 사용한다암소 비슷한 일종의 영양 date
고해상도 타이머를 지원하는 명령:
START=$(date +%s.%N)
# do something #######################
"$@" &> /dev/null
#######################################
END=$(date +%s.%N)
DIFF=$( echo "scale=3; (${END} - ${START})*1000/1" | bc )
echo "${DIFF}"
그런 다음 스크립트를 다음과 같이 호출합니다.
/usr/local/bin/timing dig +short unix.stackexchange.com
141.835
출력 단위는 밀리초입니다.
답변3
아시다시피 이 time
유틸리티는 일반적으로 셸에 내장되어 있으므로 "중립" 타이머로는 쓸모가 없습니다.
그러나 이 유틸리티는 일반적으로 외부 유틸리티로도 사용할 수 있으며 /usr/bin/time
제안한 타이밍 실험을 수행하는 데 사용될 가능성이 높습니다.
$ bash -c '/usr/bin/time foo.sh'
답변4
솔루션은 입력으로 인해 여러 번 수정되었으며 주로 /proc/uptime
및 dc
//를 사용합니다.bc
awk
활성 제어:
#!/bin/sh
read -r before _ < /proc/uptime
sleep 2s # do something...
read -r after _ < /proc/uptime
duration=$(dc -e "${after} ${before} - n")
# Alternative using bc:
# duration=$(echo "${after} - ${before}" | bc)
# Alternative using awk:
# duration=$(echo "${after} ${before}" | awk '{print $1 - $2}')
echo "It took $duration seconds."
분명히 가정은 /proc/uptime
존재하며 어떤 형태를 갖습니다.