2017-05-12 14 views
0

두 기능에 동일한 입력 데이터 (BMP)를 사용하여 두 가지 다른 기능의 속도를 비교하는 데 관심이 있습니다. 함수의 평균 또는 최소 실행 시간을 측정해야합니까?


우리가 함수의 실행 시간을 측정

우리는 같은 결과 (시간을)하지 않는다 (항상 같은 입력을 사용하는) 경우에도 우리 프로그램이 멀티 태스킹 환경에서 실행되기 때문에해야한다. 프로그램을 '높은 우선 순위'로 실행하더라도 다른 프로그램의 간섭으로 인해 프로그램 속도가 느려지므로 단일 핵심 컴퓨터를 간단하게 고려하십시오.

그래서 대부분의 사람들은 함수를 여러 번 실행하여 평균을 구할 것입니다. 내 질문에 왜 우리는 평균 대신에 가장 작은 실행 시간을 기록하지 않는 것입니까? 최소 실행 시간은 평균 실행 시간보다 실제에 훨씬 가깝습니다.

+0

취할 수있는 다른 실행 경로가없는 경우 실제 실행 시간 만 반영합니다.하나의 실행 경로가 다른 실행 경로보다 훨씬 길거나 느릴 수 있습니다. 예를 들어 어떤 조건이 충족되지 않으면 가장 짧은 시간이 초기 수익이 될 수 있습니다. 그것은 일반적인 실행 시간을 반영하지 않으며, 대부분의 사람들이 알고 싶어합니다. 예를 들어, BigInteger.divide()를 사용하십시오. 전달 된 제수가 0이면 실행 시간이 매우 짧습니다. 그러나 그것이 사실이 아니라면 단지 길어도 좋다. –

+1

더 긴 실행 시간의 존재는 함수가 측정 된 최소 시간보다 오래 걸릴 수 있다는 증거입니다. 대부분의 사람들은 임의의 시간에 임의의 부하에서 성능에 관심이 있습니다. –

+0

죄송합니다. 나는 문제를 충분히 정의하지 않았다. 나는 이것을 추가했다 : "함수의 실행 시간을 측정하라. (항상 같은 입력을 사용한다") - 이제는 다른 실행 경로가 없다. 다시 미안 해요. – Ampere

답변

1

항상 최소 시간을 목표로 설정해야합니다.
당신은 자신 만의 코드를 타이밍 만하고 다른 것은 준비하지 않았다고 확신하기 때문에. 촬영 한 실제 시간과 최소 시간
코드를 다음 당신은 항상 (많은 많은 반복에서) 최소한의 시간이 소요 단 하나의 실행 경로가있는 경우에

목표로하고 있습니다.
이렇게하면 한 두 CPU주기 내에서 정확한 타이밍을 얻을 수 있습니다. 수백만 개의 실행에 대해 코드 스 니펫을 실행하고 해당 실행의 가장 낮은 샘플을 타이밍으로 가져옵니다.
그런 다음 10x 또는 100x를 실행하는 루프에서 수백만 회의 실행을 래핑하고 다시 가장 낮은 타이밍을 취합니다. 이렇게 :

Lowest = MaxInt; 
loop 100x 
    loop million times 
    Clock.Start; 
    DoTest; 
    Timing = Clock.Time; 
    if (timing < Lowest) {Lowest = timing} 

다른 루프는 때때로 도움이되는 컨텍스트를 재설정합니다. 예 : JIT 컴파일러가 늦게 시작하면 바깥 쪽 루프는 재설정을 변경합니다.

외부 루프에서 타이밍을 지정하고 코드 스 니펫이 특히 빠르면 백만 단위로 나눌 수도 있습니다. 이 경우 여분의 빈 타이밍 루프를 실행하고 빈 루프에서 취한 시간에서 빈 루프에 소요 된 시간을 뺍니다.
코드 최적화가 빈 루프를 제거하지 못하게하려면 영리 해져야합니다 :-).

코드에 여러 경로가있을 경우 실행 시간을 실제로 정할 수 없습니다. 고정 입력으로 간단한 루프 만 실행하면 한 번만 코드 경로의 부분 시간 만 제공되기 때문입니다. 아마도 실제 성능을 나타내는 것은 아닙니다.


항상 시도하고 코드가 취할 수있는 단 하나 개의 경로가되도록 코드를 수정 결정하여 실행하십시오.
또는 가능한 모든 경로가 연속적으로 취해 지도록 테스트를 설정 한 다음 모든 시간에 소요되는 최소 시간을 측정하고 테스트 된 코드 경로 수로 나눕니다.

모든 그리고 당신이 정말로 더 이상 당신의 코드 타이밍을하지 않는 경우에 그 평균을해야하지만주의거야 할 수없는 경우
프로파일 부엌 싱크대, 당신은 또한 가지고있어 시스템 오버 헤드, HDD 중단 및 백그라운드 프로세스를 고려해야합니다.