Различие во времена возвращает отрицательное число

У меня есть этот испытательный код таймера ко времени решения Эйлера в 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]

Что я могу сделать для предотвращения этих странных отрицательных чисел?

1
задан Jon Bristow 8 July 2010 в 23:05
поделиться

2 ответа

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
2
ответ дан 2 September 2019 в 23:11
поделиться

Текущее время в секундах с эпохи:

Time.now.to_f
=> 1278631398.143

Это должно иметь микросекундное разрешение, несмотря на то, что здесь показаны только три знака после запятой.

0
ответ дан 2 September 2019 в 23:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: