Mac OS X에서 Bash 실행 시간을 밀리 초 단위로 얻는 방법은 무엇입니까?


12

내가 확인한 있지만, 제공되는 솔루션은 나를 위해 일을하지 않았다.

날짜를 사용하여 실행 시간을 초 단위로 얻을 수 있습니다.

T="$(date +%s)"
#some work here
T="$(($(date +%s)-T))"
echo "execution time (secs) ${T}"

그러나 이것을 시도하면 :

T="$(date +%s%N)"
#some work here
T="$(($(date +%s%N)-T))"

나노 초 정밀도를 얻기 위해 날짜에 % N (위와 같이)을 추가하면 다음과 같은 오류가 발생합니다.

누구든지 Mac OS X에서 bash를 사용하여 실행 시간을 밀리 초 단위로 측정하는 방법을 알고 있습니까?


나노초 분해능이 정말로 필요합니까? 이 접근 방식에는 많은 오버 헤드가 있습니다. # some work here생략 하면 0.2 ~ 0.3 초의 시간 이 주어집니다. 목표에 도달하려면 0 이상이어야합니다. 반면 /usr/bin/time usleep 50000에 0.05 +/- 0.01 sec의 안정적인 시간을 제공합니다. (Linux에서만 테스트되었으며, / usr / bin / time 및 / 또는 usleep이 OSX에서 사용 가능한지 알 수 없습니다.)
mpy

내부 클럭 해상도가 나노초 수준까지 정확한 정확도를 제공합니까?
mdpc

답변:


14

OSX는 BSD 시스템이므로 strftime 라이브러리에는 없습니다 %N( http://www.freebsd.org/cgi/man.cgi?query=date )

bash builtin time명령은 필요한 정보를 제공합니까?

time some work here

2
명확하게 해주셔서 감사합니다. 시간은 완벽하게 작동하고 세 가지 결과를 출력하지만 처음과 마지막 시간을 구체적으로 다루어야합니다.
pacodelumberg

11

밀리 초가 필요하고 BSD가 날짜를 지원하지 않으면이 경로를 사용합니다. +%s%N

perl -MTime::HiRes -e 'printf("%.0f\n",Time::HiRes::time()*1000)'

감사!!! 그것은 아무도보고하지 않은 솔루션입니다 ...
Daniele B

3

echo $(($(date +%s%N)/1000000))

이것은 나노초에서 밀리 초로 변환됩니다.

@mpy에서 date +%s.%N작동합니다.

리눅스와 OS X의 출력은 다릅니다 :
linux : 1369322592.573787111
OS X :1369322610.N


나는 다음과 같은 오류가 점점 오전 : -bash : 1369321446N을 :이 맥 OS X에서 작업을하지 않는 값 기본 너무 큰 ( "1369321446N가"토큰 오류), I는 무엇입니까 :
pacodelumberg

글쎄, 그것은 성가신 ... (잘못된 창에서 테스트 됨) 같은 오류가 나타납니다 : /
demure

1
출력을 나눌 필요가 없으며 그냥 사용하십시오 date +%s.%N(그러나 OSX를 확인할 수는 없습니다 .Linux에서 작동합니다). 그러나 문제는 그 다음이다 bash$(( ))IMHO 부동 소수점 숫자를 처리 할 수 없습니다.
mpy

@mpy 그것은 osx에서 작동합니다. 처음 10 글자와 동일하지만 리눅스와 OS X에서 다르게 동작합니다.
몸매

그것은 날짜를 사용하여 나노초 정보를 얻을 수 없다는 것을 의미합니까?
pacodelumberg

3

설치 coreutils하면 다음과 같이 date작성 하여 GNU Linux 를 사용할 수 있습니다 gdate.

coreutils는 Homebrew와 함께 사용할 수 있습니다 brew install coreutils.


1

다른 답변에서 언급했듯이 OS X의 날짜는 % N (nanoseconds)을 지원하지 않습니다.

명령을 스크립트로 제 시간에 저장할 수 있습니까? 또는 서브 쉘 또는 명령 그룹을 사용하십시오.

time (sleep 0.1; echo a; sleep 0.1)
time { sleep 0.1; echo a; sleep 0.1; }

또는 개별 명령의 시간을 합산하십시오.

$ time=$(TIMEFORMAT=%R; (time sleep 0.1; echo a) 2>&1 > /dev/null)
$ time+=+$(TIMEFORMAT=%R; (time sleep 0.1) 2>&1)
$ bc <<< $time
.206

또는 일부 스크립팅 언어를 사용하십시오.

$ ruby -e 'puts "%.3f" % Time.now'
1369329611.046
$ time ruby -e '""'
0.029
$ time ruby -e 'puts "%.3f" % Time.now'
1369329622.943
0.029

%.3f소수점이 3 개인 부동 소수점 숫자의 형식 지정자입니다. Time.now 는 Time 클래스의 클래스 메서드입니다.


답변 주셔서 감사합니다. 위의 루비 코드를 설명해 주시겠습니까?
pacodelumberg

1
에서 ruby -e 'puts "%.3f" % Time.now', ruby루비 인터프리터를 호출 -e하고 명령 행에서 따르는 스크립트를 실행합니다. puts루비의 printf일종이며, Time루비 대상이며 Time.now신기원 이후의 초입니다. 를 사용 %.3f하면 출력이 소수점 이하 3 자리 (밀리 초)로 출력됩니다 (출력의 ".046"및 ".943"부분)
Olie

1
또한 time다음 명령을 실행하는 데 걸리는 시간을 곱하는 명령 줄 도구입니다. 자세한 내용 man time은 참조하십시오.
Olie

1

Glenn이 옳고, time찾고있는 명령이지만 원하는 정보를 파싱하려면 정보를와 같은 다른 프로세서로 전달해야합니다 sed.

time command-goes-here >/dev/null 2>$1|sed rules-go-here

이 명령은 명령 자체에서 출력을 제거하고 (표준 및 오류 출력을 / dev / null로 전송) 시간 결과를 sed로 전달합니다. 여기서 스트림을 편집하기 위해 적절한 규칙을 선택해야합니다. 원하는 값

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.