Sha256: 6c999bdc4b2c5e84f7db60618bb29c162e4259d5cdcd2dba437d4d73d6733a52

Contents?: true

Size: 1.82 KB

Versions: 3

Compression:

Stored size: 1.82 KB

Contents

module Spectator
  # A timing source that can be used to access the current time as an object,
  # and a high resolution monotonic time
  class SystemClock
    # A monotonically increasing number of nanoseconds. This is useful for
    # recording times, or benchmarking.
    # Note that this is not guaranteed to be steady.
    # In other words each tick of the underlying clock may not
    # be the same length (e.g. some seconds might be longer than others)
    # @return A monotonic number of nanoseconds
    def monotonic_time
      MonotonicTime.time_in_nanoseconds
    end

    # @return a time object for the current time
    def wall_time
      Time.now
    end
  end

  # A timing source useful in unit tests that can be used to mock the methods in
  # SystemClock
  class ManualClock
    attr_accessor :wall_time
    attr_accessor :monotonic_time

    # Get a new object using 2000-1-1 0:0:0 UTC as the default time,
    # and 0 nanoseconds as the number of nanos reported by monotonic_time
    def initialize(wall_init: Time.utc(2000, 'jan', 1, 0, 0, 0), mono_time: 0)
      @wall_time = wall_init
      @monotonic_time = mono_time
    end
  end

  # Gather a monotonically increasing number of nanoseconds.
  # If Process::CLOCK_MONOTONIC is available  we use that, otherwise we attempt
  # to use java.lang.System.nanoTime if running in jruby, and fallback
  # to the Time.now implementation
  module MonotonicTime
    module_function

    if defined? Process::CLOCK_MONOTONIC
      def time_in_nanoseconds
        Process.clock_gettime(Process::CLOCK_MONOTONIC, :nanosecond)
      end
    elsif (defined?(RUBY_ENGINE) ? RUBY_ENGINE : 'ruby') == 'jruby'
      def time_in_nanoseconds
        java.lang.System.nanoTime
      end
    else
      def time_in_nanoseconds
        t = Time.now
        t.to_i * 10**9 + t.nsec
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 2 rubygems

Version Path
netflix-spectator-rb-0.1.3 lib/spectator/clock.rb
netflix-spectator-rb-0.1.1 lib/spectator/clock.rb
spectator-rb-0.1.0 lib/spectator/clock.rb