У меня есть этот испытательный код таймера ко времени решения Эйлера в Ruby.
$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]
Что я могу сделать для предотвращения этих странных отрицательных чисел?
usec
возвращает микросекунды с того же времени, что и month
возвращает месяц. Это не количество микросекунд за данное время с эпохи.
Итак, если start_t
было 1049896564,259970 секунд, а end_t
было 1049896592.123130 секунд, то вы бы получили 123130–259970, если вычесть мкс. т.е. отрицательное число.
Вместо этого вы можете использовать Time.now.to_f
, чтобы преобразовать в число с плавающей запятой количество секунд, прошедших с эпохи, и вычесть их друг из друга. Вы также можете просто вычесть один объект Time
напрямую из другого, например
start_t = Time.now
solve.call
end_t = Time.now
times << end_t - start_t
Текущее время в секундах с эпохи:
Time.now.to_f
=> 1278631398.143
Это должно иметь микросекундное разрешение, несмотря на то, что здесь показаны только три знака после запятой.