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