스크립트의 평균 실행 시간을 측정하는 방법은 무엇입니까? 0m0.048s sys 0m0.040s piousbox@piousbox-laptop:~/projects/trash$

각각 숫자의 계승을 계산하는 두 개의 스크립트가 있습니다. 어느 것이 더 빠른지 알고 싶습니다. 이 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는 있지만 더 나은 솔루션이 있다고 생각합니까?



답변

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

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

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

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

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

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

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

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


답변

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

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


답변

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


답변

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

perf stat -r 10 -B sleep 1

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

1.002248382 seconds time elapsed                   ( +-  0.01% )


답변

python -m timeit -n 1 -r 100 -s 'import os' 'os.system("ruby fac1.rb")'

를 들어 -n, -r및 기타 옵션을 볼 https://docs.python.org/2/library/timeit.html#command-line-interface


답변

Hyperfine 은 또 다른 옵션입니다.

샘플 사용법 :

hyperfine --warmup 3 'ruby fac1.rb'


답변