스크립트의 평균 실행 시간을 측정하는 방법은 무엇입니까?


23

각각 숫자의 계승을 계산하는 두 개의 스크립트가 있습니다. 어느 것이 더 빠른지 알고 싶습니다. 이 time명령은 밀리 초를 제공하며 결과는 때때로 다릅니다.

piousbox@piousbox-laptop:~/projects/trash$ time ruby fac2.rb
30414093201713378043612608166064768844377641568960512000000000000

real    0m0.089s
user    0m0.052s
sys 0m0.028s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac1.rb
30414093201713378043612608166064768844377641568960512000000000000

real    0m0.091s
user    0m0.048s
sys 0m0.036s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac1.rb
30414093201713378043612608166064768844377641568960512000000000000

real    0m0.088s
user    0m0.048s
sys 0m0.040s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac2.rb
30414093201713378043612608166064768844377641568960512000000000000

real    0m0.088s
user    0m0.048s
sys 0m0.028s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac1.rb
30414093201713378043612608166064768844377641568960512000000000000

real    0m0.087s
user    0m0.064s
sys 0m0.028s
piousbox@piousbox-laptop:~/projects/trash$ time ruby fac2.rb
30414093201713378043612608166064768844377641568960512000000000000

real    0m0.089s
user    0m0.068s
sys 0m0.016s
piousbox@piousbox-laptop:~/projects/trash$ 

스크립트를 실행하는 데 평균 시간이 어떻게 걸립니까? 100의 결과를 구문 분석하고 평균을 내릴 수 time는 있지만 더 나은 솔루션이 있다고 생각합니까?


답변:


4

아니요, 평균화에 대한 아이디어는 정확합니다.

스크립트 실행은 많은 요소에 따라 달라 지지만 설정 시간 (메모리에 인터프리터로드, 코드 설정 및 바이트 코드 또는 머신 코드로 컴파일 가능)과 실제 실행 시간 사이에 분할되어야합니다.

내부 실행 시간에 더 집중하기 위해 스크립트 자체에서 루프를 수행합니다 (즉, 하나의 계승을 계산하는 대신 스크립트를 한 번 실행하여 100 회 계산합니다. 스크립트는 한 번 설정되고 내부 루틴은 100을 실행 함) 타임스).

총 시간에 집중하기 위해 스크립트를 100 회 실행하고 결과를 평균화합니다. 이상적으로는 시스템이 매번 "참조 상태"(또는 스크립트 관련이없는 상태)로 반환 될 수 있도록 실행을 분리해야합니다. 예를 들어, 인터프리터 자체 는 메모리에 캐시되므로 스크립트의 첫 번째 실행이 후속 스크립트보다 상당히 느려집니다.

알고리즘에 대한 더 나은 통찰력을 얻으려면 가장 좋은 방법은 다음과 같은 것입니다 (그렇지 않으면 유휴 시스템에서).

  • 하나의 함수로 알고리즘을 래핑하십시오.
  • 제어 애플리케이션에서 :
    • 함수를 한 번 호출
    • 시스템 ( "벽시계") 시간을 얻고 10 초 (또는 합리적인 N) 초를 추가하십시오
    • 루프를 입력하고 반복 횟수를 시작하십시오
    • 함수를 호출 할 때마다 카운터를 증가시킵니다.
    • 시스템 시간이 저장된 시간보다 낮 으면 다른 루프를 수행하십시오.
    • 현재 벽시계 시간에서 정확한 N, 부동 소수점을 얻습니다.
    • 카운터를 N으로 나눈 값을 표시하십시오. 그것은 초당 반복 횟수입니다.

응용 프로그램은 한 번만 실행되며 모든 설정 및 프라이밍은 시간이 지정되지 않은 첫 번째 반복으로 수행되므로 오버 헤드를 최소화해야합니다 (시간 호출 제외).

함수가 입력을받는 경우, 고정 된 값으로 시드 된 PRNG를 사용하여 임의의 입력 시퀀스를 제공하여 테스트중인 함수의 두 버전이 동일한 값을 수신하도록하는 것이 좋습니다. 이것은 "행운의 숫자"로 인해 하나의 기능이 분명히 더 잘 수행되는 것을 피합니다 (예를 들어 정렬 할 항목의 수가 2 k -1이고 작은 k s 인 경우 Hillsort 알고리즘의 변형이 훨씬 더 우수함을 기억합니다 ).


그래, 고마워 나는 그 이후의 전화가 짧아지는 것을 알아 차렸다. 이제 스크립트 내에서 루프를 실행하고 한 알고리즘이 다른 알고리즘보다 확실히 빠르다는 것을 알았습니다.
Victor Piousbox 2018 년

39

루프에서 프로그램의 반복을 실행할 수 있습니다. 총 시간을 반복 횟수로 나눕니다.

time for i in {1..10}; do sleep 1; done
real    0m10.052s
user    0m0.005s
sys 0m0.018s

2
매우 간단하고 사랑합니다. 나는 또한 {1..10}전에 본 적이 없으며 그것이 작동한다는 것을 당황스럽게 생각합니다. 단지 슬픈 것은 결과의 퍼짐 (최소 및 최대 시간)을 모른다는 것입니다.
w00t

@ w00t :man -P 'less +/Brace\ Expansion' bash
user2683246 1

감사합니다 @ user2683246! 그런 다음 gnu.org/software/bash/manual/bash.html#Brace-Expansion 에서도 발견되었습니다 . 적은 btw를 잘 사용합니다. 지금은 ...이 떠들썩한 파티에 등장시기에 대한 궁금
w00t

1
Aha, 버전 3, bash를 사용하기 시작한지 ​​10 년 후 :) tldp.org/LDP/abs/html/bashver3.html
w00t

2
Google 직원에게 연락하지 않는 경우 귀하가 실행 중이 아니기 때문일 수 있습니다 bash. /bin/bash이 전에 실행 하십시오.
코리 클라인

14

multitime 이라는 도구가 있습니다. 명령을 여러 번 실행하고 소요 시간 측정 (실제 / 사용자 / 시스템 평균, 최소 / 최대 및 평균 시간이 자동으로 계산 됨)

예를 들어, 비슷한 스크립트를 100 번 측정하는 경우 :

multitime -q -n 100 "fact1.sh"
===> multitime results
1: -q fact1.sh
            Mean        Std.Dev.    Min         Median      Max
real        0.122       0.032       0.086       0.116       0.171       
user        0.148       0.044       0.096       0.137       0.223       
sys         0.023       0.019       0.000       0.014       0.061 

12

이것은 오래되었지만 이전에 사용했지만 찾을 수없는 명령을 찾을 때 Google에서 너무 높아졌습니다. 어쨌든, 내가 선호하는 방법은 다음과 같습니다.

perf stat -r 10 -B sleep 1

이것은 마지막에 평균 실행 시간을 포함하여 상당히 많은 세부 사항을 제공합니다.

1.002248382 seconds time elapsed                   ( +-  0.01% )


1

Hyperfine 은 또 다른 옵션입니다.

샘플 사용법 :

hyperfine --warmup 3 'ruby fac1.rb'

1
초 미세는 다른 대안보다 훨씬 낫습니다. 러닝 필요, 예열, 아름다운 결과물, 마크 다운 보고서, 녹으로 기록됨 등
Klas Mellbourn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.