lib/ddmetrics/stopwatch.rb in ddmetrics-1.0.1 vs lib/ddmetrics/stopwatch.rb in ddmetrics-1.1.0

- old
+ new

@@ -1,9 +1,11 @@ # frozen_string_literal: true module DDMetrics class Stopwatch + NANOS_PER_SECOND = 1_000_000_000 + class AlreadyRunningError < StandardError def message 'Cannot start, because stopwatch is already running' end end @@ -19,34 +21,50 @@ 'Cannot get duration, because stopwatch is still running' end end def initialize - @duration = 0.0 + @duration = 0 @last_start = nil end + def run + start + yield + ensure + stop + end + def start raise AlreadyRunningError if running? - @last_start = Time.now + + @last_start = nanos_now end def stop raise NotRunningError unless running? - @duration += (Time.now - @last_start) + + @duration += (nanos_now - @last_start) @last_start = nil end def duration raise StillRunningError if running? - @duration + + @duration.to_f / NANOS_PER_SECOND end def running? !@last_start.nil? end def stopped? !running? + end + + private + + def nanos_now + Process.clock_gettime(Process::CLOCK_MONOTONIC, :nanosecond) end end end