2010-07-08 3 views
1

루비의 오일러 솔루션을 테스트하는 데이 평가판 타이머 코드가 있습니다.시간의 차이가 음수를 반환합니다.

$RUNS = 12 
def run(solve) 
    times = [] 
    $RUNS.times do 
    start_t = Time.now.usec 
    solve.call 
    end_t = Time.now.usec 
    times << (end_t - start_t)/1000.0 
    end 
    #times = times.delete_if {|i| i < 0} 
    puts times.inspect 
    times.sort 

    mean = times.inject{|a,c| a+c}/$RUNS 
    puts("Mean:\t#{mean}"); 
    if (times.length % 2 == 0) then 
    median = (times[times.length/2 - 1] + times[times.length/2])/2.0 
    else 
    median = times[times.length/2]; 
    end 
    puts("Median: #{median}"); 

end 

불행하게도,이 같은 답변 얻기 유지 :

[409.805, 418.16, -582.23, 402.223, -581.94, 413.196, 426.816, -584.732, 519.457, -569.557, 558.918, -579.176] 

나는이 이상한 음수를 방지하기 위해 무엇을 할 수 있는가?

답변

2

usec 같은 시간에 마이크로 초를 반환하는 경우 month은 월을 반환합니다. 그것은 그 시대로부터 주어진 시간 동안의 마이크로 초가 아닙니다.

따라서 start_t이 1049896564.259970 초이고 end_t이 1049896592.123130 초인 경우 usecs에서 빼면 123130 - 259970이됩니다. 즉 음수이다.

대신에 신구원부터 부동 소수점 수로 변환하고 서로 빼기 위해 Time.now.to_f을 사용할 수 있습니다. 하나의 Time 개체를 다른 개체에서 직접 뺄 수 있습니다. 신기원부터 초

start_t = Time.now 
solve.call 
end_t = Time.now 
times << end_t - start_t 
+0

그런 다음 어떻게 루비에서 높은 세분성 타이밍을 수행합니까? –

+0

@JBristow Answer 원하는대로하는 방법에 대한 제안으로 업데이트되었습니다. – mikej

+0

이것은 부동 소수점 오류를 요구하는 것 같지만 msec 단위를 얻기 위해 1000을 곱합니다. –

0

현재 시간 :

Time.now.to_f 
=> 1278631398.143 

세 개의 소수 자릿수에도 불구하고, 마이크로 해상도를 가지고 있어야 여기에 표시된다.

관련 문제