프로그램 실행 시간을 측정하여 변수에 저장하는 방법

프로그램 실행 시간을 측정하여 변수에 저장하는 방법

timeBash(v4+) 스크립트의 특정 작업에 소요되는 시간을 확인하기 위해 명령의 출력을 "별도로" 구문 분석하고 (결국) let VARNAME=...Bash 변수( )에 캡처하고 싶습니다 .

time -f '%e' ...지금은 (또는 내장된 Bash 때문에) 사용하고 있지만 command time -f '%e' ...실행된 명령의 출력을 리디렉션했기 때문에 명령의 출력을 캡처하는 방법을 잘 모르겠습니다 time. 기본적으로 여기서 문제는별도의 출력time명령 실행 의 출력입니다.

내가 원하는 건특징시작 명령과 완료 사이의 시간(초)을 계산합니다. 반드시 time명령이나 해당 내장 명령일 필요는 없습니다 .


편집하다:아래 두 가지 유용한 답변을 바탕으로 두 가지 설명을 추가하고 싶습니다.

  1. 실행된 명령의 출력을 폐기하고 싶지는 않지만 그것이 stdout으로 끝나든 stderr로 끝나든 상관없습니다.
  2. 나는 간접적인 접근 방식(즉, 출력을 중간 파일에 저장하는 대신 직접 캡처하는 것)보다 직접적인 접근 방식을 선호합니다.

지금까지 사용된 솔루션은 date내가 원하는 솔루션에 가깝습니다.

답변1

출력을 timevar에 넣으려면 다음 명령을 사용하십시오.

usr@srv $ mytime="$(time ( ls ) 2>&1 1>/dev/null )"
usr@srv $ echo "$mytime"

real    0m0.006s
user    0m0.001s
sys     0m0.005s

utime과 같은 단일 시간 유형만 요청할 수도 있습니다.

usr@srv $ utime="$( TIMEFORMAT='%lU';time ( ls ) 2>&1 1>/dev/null )"
usr@srv $ echo "$utime"
0m0.000s

시간을 얻으려면 다음을 사용하여 date +%s.%N실행 전후의 시간을 구하고 차이를 계산할 수도 있습니다.

START=$(date +%s.%N)
command
END=$(date +%s.%N)
DIFF=$(echo "$END - $START" | bc)
# echo $DIFF

답변2

에 속 하고 1초 미만의 정확도가 필요하지 않은 bash경우 호출을 완전히 건너뛰고 추가 프로세스를 생성하지 않고, 결합된 출력을 분리할 필요 없이, 캡처 및 구문 분석할 필요 없이 이를 수행할 수 있습니다. 모든 명령의 출력:shdate

# SECONDS is a bash special variable that returns the seconds since set.
SECONDS=0
mycmd <infile >outfile 2>errfile
DURATION_IN_SECONDS=$SECONDS
# Now `$DURATION_IN_SECONDS` is the number of seconds.

답변3

Bash에서 구성의 출력은 time표준 오류로 이동하며 영향을 받는 파이프의 표준 오류를 리디렉션할 수 있습니다. 이제 출력 및 오류 스트림을 작성하는 명령부터 시작해 보겠습니다 sh -c 'echo out; echo 1>&2 err'. 명령의 오류 스트림을 출력과 혼동하지 않기 위해 time명령의 오류 스트림을 일시적으로 다른 파일 설명자로 이동할 수 있습니다.

{ time -p sh -c 'echo out; echo 1>&2 err' 2>&3; }

out그러면 fd 1, errfd 3 및 fd 2에 시간이 기록됩니다 .

{ time -p sh -c 'echo out; echo 1>&2 err' 2>&3; } \
    3> >(sed 's/^/ERR:/') 2> >(sed 's/^/TIME:/') > >(sed 's/^/OUT:/')

fd 2의 시간과 fd 3의 시간이 더 즐겁다면 err이를 교환합니다. 이는 두 개의 파일 설명자를 교환할 직접적인 방법이 없기 때문에 문제가 됩니다:

{ { { time -p sh -c 'echo out; echo 1>&2 err' 2>&3; } 3>&2 2>&4; } 4>&3; } 3> >(sed 's/^/TIME:/') 2> >(sed 's/^/ERR:/') > >(sed 's/^/OUT:/')

이는 명령 출력을 후처리하는 방법을 보여 주지만 명령 출력과 타이밍을 캡처하려면 더 열심히 작업해야 합니다. 임시 파일을 사용하는 것이 한 가지 해결책입니다. 실제로 이는 명령의 표준 오류와 표준 출력을 캡처해야 하는 경우 신뢰할 수 있는 유일한 솔루션입니다. 그러나 그 이상으로 전체 출력을 캡처하고 time예측 가능한 형식이 있다는 사실을 활용할 수 있습니다 ( time -p사용하는 경우).POSIX 형식또는 bash 특정 TIMEFORMAT변수).

nl=$'\n'
output=$(TIMEFORMAT='%R %U %S %P'; mycommand)
set ${output##*$nl}; real_time=$1 user_time=$2 system_time=$3 cpu_percent=$4
output=${output%$nl*}

벽시계 시간에만 관심이 있다면 date전후를 실행하는 것이 간단한 해결책입니다(외부 명령을 로드하는 데 걸리는 추가 시간으로 인해 정확도가 약간 떨어지는 경우).

답변4

OSX에서 이전 답변을 모두 합칠 때

ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G31+

당신은 이것을 할 수 있습니다

microtime() {
    python -c 'import time; print time.time()'
}
compute() {
    local START=$(microtime)
    #$1 is command $2 are args
    local END=$(microtime)
    DIFF=$(echo "$END - $START" | bc)
    echo "$1\t$2\t$DIFF"
}

관련 정보