Monotonik
Usually, Ruby-developers measure elapsed time this way:
t1 = Time.now
t2 = Time.now
time_elapsed = t2 - t1
But this way of measuring has an important issue: Time.now
doesn't move only forwards 🤷♂️ It can be changed manually by the system administrator. Or system time on your machine may be changed during syncing with NTP server. You can read more about this issue here.
So, there is no guarantee that the new value returned by Time.now
will be in the future, and the elapsed time calculated this way may be even a negative value 🤷♂️
If you want to measure elapsed time the right way, you should use the monotonic clock. Each time you request the time of the monotonic clock, time since a specific event is returned: for example, on macOS, this event is the system boot. Ruby provides a method to receive the current value of system monotonic clocks:
t1 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
t2 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
time_elapsed = t2 - t1
In its turn, monotonik
gem provides tiny wrappers over this functionality to avoid writing a lot of boilerplate code.
Installation
Add this line to your application's Gemfile:
gem 'monotonik'
And then execute:
$ bundle install
Or install it yourself as:
$ gem install monotonik
Usage
How to measure elapsed time using monotonik
? Here is an example:
start = Monotonik.clock_time
finish = Monotonik.clock_time
elapsed = finish - start
In order to avoid writing such boilerplate code, you can use Monotonik.measure
method:
result = Monotonik.measure { factorial(100_000) }
result.value
result.time
Both Monotonik.clock_time
and Monotonik.measure
methods receive type of the return clock time value as the only argument. It can be set to one of the following values:
:float_second
- number of seconds as a float (by default):float_millisecond
- number of milliseconds as a float:float_microsecond
- number of microseconds as a float:second
- number of seconds as an integer:millisecond
- number of milliseconds as an integer:microsecond
- number of microseconds as an integer:nanosecond
- number of nanoseconds as an integer
Development
After checking out the repo, run bin/setup
to install dependencies. Then, run bin/rspec
to run the tests. You can also run bin/console
for an interactive prompt that will allow you to experiment.
To install this gem onto your local machine, run bin/rake install
. To release a new version, update the version number in version.rb
, and then run bin/rake release
, which will create a git tag for the version, push git commits and tags, and push the .gem
file to rubygems.org.
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/evgenygarl/monotonik.
License
The gem is available as open source under the terms of the MIT License.