时间的差异是返回负数

时间:2010-07-08 23:05:34

标签: ruby time

我有这个试用计时器代码来计算Ruby中的euler解决方案。

$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 个答案:

答案 0 :(得分: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 个对象,例如。

{{1}}

答案 1 :(得分:0)

自纪元以来的当前时间秒数:

Time.now.to_f
=> 1278631398.143

尽管这里只显示了三位小数,但它应具有微秒分辨率。