R의 타이밍 기능 [닫힘]


36
  1. 함수 실행을 반복하는 데 걸리는 시간을 측정하고 싶습니다. 인가 replicate()및 사용 금액에 해당하는-루프? 예를 들면 다음과 같습니다.

    system.time(replicate(1000, f()));
    system.time(for(i in 1:1000){f()});
    

    선호되는 방법은 무엇입니까?

  2. 의 출력 system.time()sys+user프로그램을 실행하기위한 실제 CPU 시간은? 가요 elapsed프로그램의 시간 성능의 좋은 측정은?


3
이 질문의 과정을 변경하기에는 너무 늦었으므로 레코드에 불과합니다. 이것은 StackOverflow에 가장 적합한 문제입니다.
매트 파커

2
@Matt 나는 프로그램이 SO에 얼마나 적합한 지에 대한 질문에 동의합니다. 나는 또한이 질문에 대한 문자 적 ​​해석 (여러 답변에서 취한)이 이력서에서이 주제를 벗어나게 할 것이라는 데 동의합니다. 타이밍 실험 을 설계 하고 그러한 실험의 결과를 분석하는데 통계적인 관심이있는 것으로 보인다 .
whuber

답변:


19

프로그램의 효과적인 타이밍을 위해서는, 특히 대안 솔루션을 비교하고 싶을 때 제어가 필요합니다! 좋은 방법은 타이밍을 맞추는 절차를 기능에 넣는 것입니다. 타이밍 루프 내에서 함수를 호출하십시오. 기본적으로 함수에서 모든 코드를 제거하고 코드에서 반환하여 스텁 프로 시저를 작성하십시오 (그러나 모든 인수는 그대로 두십시오). 스터브를 타이밍 루프에 넣고 다시 시간을 정하십시오. 타이밍과 관련된 모든 오버 헤드를 측정합니다. 그물을 얻기 위해 절차 시간에서 스터브 시간을 빼십시오. 이것은 실제 필요한 시간을 정확하게 측정해야합니다.

요즘 대부분의 시스템은 일시적으로 중단 될 수 있기 때문에 가변성을 확인하기 위해 여러 타이밍 실행을 수행하는 것이 중요합니다. 초 동안 1 회 실행하는 대신 각각 약 초 동안 회 실행하십시오 . 이중 루프에서 한 번 에이 작업을 수행하는 데 도움이됩니다. 다루기가 쉬울뿐만 아니라 각 시계열에 약간의 음의 상관 관계가 도입되어 실제로 추정값이 향상됩니다.NmN/m

실험 설계의 기본 원리를 사용하면 코드 배포 방식으로 인한 차이 (예 : for 루프와 replicate ()의 차이)를 근본적으로 제어 할 수 있습니다. 그러면 문제가 해결됩니다.


25

두 가지 점에 관해

  1. 문체입니다. replicate()기능적인 것이 마음 에 듭니다.
  2. 나는 elapsed세 번째 숫자 에 집중하는 경향이 있습니다.

내가 자주하는 일은

N <- someNumber
mean(replicate( N, system.time( f(...) )[3], trimmed=0.05) )

N 반복 호출의 90 %를 트리밍 한 평균을 얻으려면 f().

(사고를 잡은 해들리 덕분에 편집.)


2
당신은 의미하지 mean(replicate(N, system.time(f(...))[3]), trim = 0.05)않습니까?
hadley

2
f () 호출이 길면 괜찮습니다. 그러나 f () 호출이 짧으면 타이밍 호출 오버 헤드로 인해 오류 측정이 증가 할 수 있습니다. f ()를 여러 번 반복하여 system.time ()을 한 번 호출하면 오류가 무한 값이 될 때까지 오류를 나눕니다 (더 빨리 반환됩니다).
John

@ 존 : 고맙지 만 당신이 말한 것을 얻지 못했습니다. system.time () 내부 또는 외부에서 f ()를 반복하여 어느 것이 더 나은지 여전히 궁금합니다.
Tim

system.time () 명령을 호출 할 때마다 약간의 측정 오류가 발생하는 호출 시간이 있습니다. 이것은 소량입니다. 그러나 f ()가 매우 간단한 호출이라면? 그런 다음이 오류는 f ()를 호출하는 데 걸리는 시간과 관련이 있습니다. 따라서 단일 system.time () 호출에서 f ()를 1e5 번 호출하면 오류가 1e5 청크로 나뉩니다. 모든 f ()에 대해 system.time ()을 호출 할 때 f ()의 시간이 작 으면 영향이 의미가있을 수 있습니다. 물론, 당신이 필요로하는 모든 것이 상대적 타이밍이라면 별 문제가되지 않습니다.
John

아, 그리고 두 번째 부분은 system.call ()을 한 번만 호출하는 것이 더 빠르다는 것입니다.
John

10

Sys.time;에 의해 리턴 된 시간 간격으로 시간을 지정할 수도 있습니다 . 이것은 물론 벽 시간을 측정하므로 실시간 계산 시간입니다. 예제 코드 :

Sys.time()->start;
replicate(N,doMeasuredComputation());
print(Sys.time()-start);


1

그들은 다른 일을합니다. 당신이 원하는 것을 시간. replicate ()은 각 함수 실행 결과의 벡터를 반환합니다. for 루프는 그렇지 않습니다. 그러므로 그것들은 동등한 진술이 아닙니다.

또한 원하는 방식으로 여러 가지 시간을 정하십시오. 그런 다음 가장 효율적인 방법을 찾을 수 있습니다.


mod-tip : Dirk의 답변에 대한 주석으로 두 번째 부분을 게시하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.