programing

셸에서 프로그램 실행 시간 가져오기

topblog 2023. 5. 28. 19:52
반응형

셸에서 프로그램 실행 시간 가져오기

저는 몇 가지 다른 조건에서 리눅스 셸에서 무언가를 실행하고 각 실행의 실행 시간을 출력할 수 있기를 원합니다.

펄이나 파이썬 스크립트를 작성하여 이를 수행할 수 있다는 것을 알고 있습니다. 하지만 셸에서 이를 수행할 수 있는 방법이 있습니까?(우연히 bash)

제공 기능을 합니다.time키워드:

도움의 시간
시간: 시간 [-p] PIPLINEPIPELINE을 실행하고 실시간, 사용자 CPU 시간,파이프라인이 종료될 때 파이프라인을 실행하는 데 소요되는 시스템 CPU 시간입니다.
반환 상태는 PIPLINE의 반환 상태입니다.'-p' 옵션에서는 타이밍 요약을 약간 다른 형식으로 인쇄합니다.이 기능은 다음과 같습니다.TIME FORMAT 변수의 값을 출력 형식으로 지정합니다.

예:

$ time sleep 2
실제 0m2.009s사용자 0m0.000ssys0m0.004s

에 내장된 bash보다 더 수 .time(즉, 로버트 갬블이 언급한 시간(1)).일반적으로 이것입니다./usr/bin/time.

편집자 참고 사항:외부 유틸리티를 호출하려면 time보다.time 키워드, 다음으로 호출/usr/bin/time.timePOSIX 필수 유틸리티이지만 지원하기 위해 필요한 유일한 옵션은-p은 특정한확장을 합니다.-vGNU와 함께 작동합니다.time아래에 설명된 바와 같이 유틸리티(질문은 가 지정된 Linux); 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을 사용합니다.

$ npm install -g gnomon
$ <your command> | gnomon --medium=1.0 --high=4.0 --ignore-blank --real-time=100

다른 명령의 표준 출력에 타임스탬프 정보를 추가하는 명령줄 유틸리티입니다.시간이 오래 걸리는 작업을 기록할 수 있는 장기 실행 프로세스에 유용합니다.

은 또한 있다니습수도를 할 수 .--high 및/는--medium노란색으로 표시할 입니다. gnomon 타임초이간또는노을로강으란표길임조이다값계시할니옵정는션입지하색색빨스를탬프초▁options을▁in,다gn▁to니▁in▁threshold▁theomon옵션입).그리고 여러분은 몇 가지 다른 것들도 할 수 있습니다.

예

정확한 , 정확정원면다한를보한더,면▁use▁should,원▁precision다.%N와 함께date 사용)bc, 선우, 면하냐왜.$(())정수만 처리합니다.

방법은 다음과 같습니다.

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 또는 원하는 구문을 사용하여 동일한 작업을 참조하십시오.저는 이 기술을 좋아합니다.

초 단위의 정밀도만 필요한 경우 기본 제공 기능을 사용할 수 있습니다.$SECONDS변수 - 셸이 실행된 시간(초)을 카운트합니다.

while true; do
    start=$SECONDS
    some_long_running_command
    duration=$(( SECONDS - start ))
    echo "This run took $duration seconds"
    if some_condition; then break; fi
done

사용할 수 있습니다.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

한 가지 가능한 간단한 방법(다른 사용자의 요구를 충족시키지 못할 수도 있음)은 셸을 사용하는 것입니다. PROMPT.it 은 경우에 따라 유용할 수 있는 간단한 솔루션입니다.아래 예와 같이 bash 프롬프트 기능을 사용할 수 있습니다.

PS1='[\t \u@\h]\$' 내보내기

위의 명령을 실행하면 셸 프롬프트가 다음으로 변경됩니다.

[HH:MM:SS username@hostname]$

명령을 실행하거나 Enter 키를 눌러 셸 프롬프트로 돌아갈 때마다 프롬프트에 현재 시간이 표시됩니다.

주의:
다음 명령을 입력하기 전에 잠시 기다린 경우 이 시간을 고려해야 합니다. 즉, 셸 프롬프트에 표시되는 시간은 명령을 입력할 때가 아니라 셸 프롬프트가 표시될 때의 타임스탬프입니다.일부 사용자는 다음 명령을 준비하기 전에 Enter 키를 눌러 새 타임스탬프가 있는 새 프롬프트를 가져옵니다.
bash 프롬프트를 변경하는 데 사용할 수 있는 다른 옵션 및 한정자도 있습니다. 자세한 내용은 (manbash)를 참조하십시오.

perf stat리눅스 CLI 유틸리티

이 도구는 시간을 벌기에는 너무 많습니다.그러나 프로필을 작성하고 느린 속도를 수정하는 데 도움을 주는 것이 훨씬 더 많은 도움이 될 수 있으므로 알아둘 가치가 있습니다.Ubuntu 22.04 설정:

sudo apt install linux-tools-common linux-tools-generic
echo -1 | sudo tee /proc/sys/kernel/perf_event_paranoid

용도:

perf stat <mycmd>

다음을 사용한 샘플 실행:

perf stat stress-ng --cpu 1 --cpu-method matrixprod -t 5

샘플 출력:

 Performance counter stats for 'stress-ng --cpu 1 --cpu-method matrixprod -t 5':

          5,005.46 msec task-clock                #    0.999 CPUs utilized          
                88      context-switches          #   17.581 /sec                   
                 1      cpu-migrations            #    0.200 /sec                   
             1,188      page-faults               #  237.341 /sec                   
    18,847,667,167      cycles                    #    3.765 GHz                    
    26,544,261,897      instructions              #    1.41  insn per cycle         
     3,239,655,001      branches                  #  647.225 M/sec                  
        25,393,369      branch-misses             #    0.78% of all branches        

       5.012218939 seconds time elapsed

       4.998051000 seconds user
       0.009122000 seconds sys

perf또한 여러 고급 작업을 수행할 수 있습니다. 예를 들어 코드 프로파일링에 사용하는 방법을 보여줍니다.리눅스에서 실행되는 C++ 코드를 어떻게 프로파일링합니까?

언급URL : https://stackoverflow.com/questions/385408/get-program-execution-time-in-the-shell

반응형