bash가 아닌 범용 `time` 벤치마크 대안? [폐쇄]

bash가 아닌 범용 `time` 벤치마크 대안? [폐쇄]

다른 쉘 간의 스크립트 실행 시간을 비교하기 위해 일부 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

주의하셔야 할 점은timePOSIX에 의해 지정됨, 그리고 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/uptimedc//를 사용합니다.bcawk활성 제어:

#!/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존재하며 어떤 형태를 갖습니다.

관련 정보