tick-tock

DESCRIPTION

A gem that provides a simple mechanism for timing and reporting how long your code takes to run. Benchmark is great but, for simple timing needs, I prefer a narrower API. Often, I just want to know how long something took without having to add temporary variables and fuss over the output.

INSTALL

gem install tick-tock

FEATURES

  • Easy API

  • Flexible API

  • Simple, easy to read output

  • Handles milliseconds, seconds, minutes, hours, days, weeks, and years

USAGE

Usage Scenario 0

$> TickTock.time { sleep 4 }

=> 4s 0ms

Usage Scenario 1

For simple, everyday use.

t = TickTock.time do
  # do stuff
  sleep 10
end
puts "That took #{t}"

That took 10s 0ms

t = TickTock.time do
  sleep 314503737247018
end
puts "That took #{t}"

That took 10000y 12w 5d 13h 14m 7s 18ms

Usage Scenario 2

TickTock.time returns a TickTock::Duration. These can be added together like so:

thing1 = TickTock.time do
  sleep 10
end
puts "Thing 1 took: #{thing1}"

thing2 = TickTock.time do
  sleep 55
end
puts "Thing 2 took: #{thing2}"

puts "In total, that took #{thing1 + thing2}"

Thing 1 took: 10s 0ms
Thing 2 took: 55s 0ms
In total, that took 1m 5s 0ms

Usage Scenario 3 - collecting parameter

If you’d rather, you can get a fresh instance of a TickTock::Duration with a call to #fresh. Then, you can pass the duration into TickTock::time. This might be useful if you want to pass around a duration to other methods and accumualte timings. Do this, like so:

total = TickTock.fresh
thing1 = TickTock.time(total) do
  sleep 10
end
puts "Thing 1 took #{thing1}"

thing2 = TickTock.time(total) do
  sleep 55
end
puts "Thing 2 took #{thing2}"

puts "In total, that took #{t}"

Thing 1 took: 10s 0ms
Thing 2 took: 55s 0ms
In total, that took 1m 5s 0ms

Usage Scenario 4 - running total

Or, you might want to accumulate a running total like so:

total = TickTock.fresh
total += TickTock.time do
  sleep 4
end
total += TickTock.time do
  sleep 15
end
total += TickTock.time do
  sleep 19
end
puts "In total, that took #{t}"

In total, that took 38s 0ms

Usage Scenario 5 - using duration on it’s own

duraton = TickTock::Duration.new(314503737247018)
puts "That's a long time: #{duration}"

That's a long time: 10000y 12w 5d 13h 14m 7s 18ms

duration = TickTock::Duration.from_start_to_finish(4.years.ago, Time.now)
puts "That's not so long: #{duration}"

That's not so long: 4y 0w 0d 0h 0m 0s 0s

duration = TickTock::Duration.from_pieces(10, 20, 30)
puts "Pieces example 1: #{duration}"

Pieces example 1: 30m 20s 10ms

duration = TickTock::Duration.from_pieces(5, 10, 15, 20, 25, 30, 35)
puts "Pieces example 2: #{duration}"

Pieces example 2: 35y 30w 25d 20h 15m 10s 5ms

Example Duration Output

#to_s method only outputs as much as needed and in a brief, easy to understand format

With a duration of 5 milliseconds:

5ms

With a duration of 45 second, 5 milliseconds:

45s 5ms

With a duration of 5 minutes, 45 seconds, and 15 milliseconds

5m 45s 15ms

With a duration of 4 hours, 5 minutes, 45 seconds, and 15 milliseconds

4h 5m 45s 15ms

With a duration of 6 days, 4 hours, 5 minutes, 45 seconds, and 15 milliseconds

6d 4h 5m 45s 15ms

With a duration of 9 weeks, 6 days, 4 hours, 5 minutes, 45 seconds, and 15 milliseconds

9w 6d 4h 5m 45s 15ms

With a duration of 1014 years, 9 weeks, 6 days, 4 hours, 5 minutes, 45 seconds, and 15 milliseconds

1014y 9w 6d 4h 5m 45s 15ms

Contributing to tick-tock

Feel free to request a feature, point out a bug, or fork/etc.

  • Check out the latest master to make sure the feature hasn’t been implemented or the bug hasn’t been fixed yet.

  • Check out the issue tracker to make sure someone already hasn’t requested it and/or contributed it.

  • Fork the project.

  • Start a feature/bugfix branch.

  • Commit and push until you are happy with your contribution.

  • Make sure to add tests for it. This is important so I don’t break it in a future version unintentionally.

  • Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.

Copyright © 2012 Ian Goodrich. See LICENSE.txt for further details.