hitimes 2.0.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +1 -1
- data/HISTORY.md +20 -3
- data/Manifest.txt +2 -17
- data/README.md +38 -43
- data/hitimes.gemspec +26 -0
- data/lib/hitimes/initialize.rb +83 -44
- data/lib/hitimes/instant.rb +9 -33
- data/lib/hitimes/interval.rb +15 -15
- data/lib/hitimes/metric.rb +18 -22
- data/lib/hitimes/mutexed_stats.rb +2 -4
- data/lib/hitimes/paths.rb +16 -14
- data/lib/hitimes/stats.rb +33 -33
- data/lib/hitimes/timed_metric.rb +43 -42
- data/lib/hitimes/timed_value_metric.rb +43 -43
- data/lib/hitimes/value_metric.rb +16 -15
- data/lib/hitimes/version.rb +3 -1
- data/lib/hitimes.rb +12 -11
- metadata +20 -113
- data/Rakefile +0 -19
- data/examples/benchmarks.rb +0 -113
- data/examples/stats.rb +0 -31
- data/spec/hitimes_spec.rb +0 -24
- data/spec/interval_spec.rb +0 -136
- data/spec/metric_spec.rb +0 -28
- data/spec/mutex_stats_spec.rb +0 -29
- data/spec/paths_spec.rb +0 -11
- data/spec/spec_helper.rb +0 -11
- data/spec/stats_spec.rb +0 -98
- data/spec/timed_metric_spec.rb +0 -155
- data/spec/timed_value_metric_spec.rb +0 -171
- data/spec/value_metric_spec.rb +0 -108
- data/spec/version_spec.rb +0 -7
- data/tasks/default.rake +0 -242
- data/tasks/this.rb +0 -208
- /data/{LICENSE → LICENSE.txt} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d79a16734531380e103efb7bf1af93e5c4e465185f5a47f1c0ab6d2dcc8bb5e7
|
4
|
+
data.tar.gz: deb8a23bdc8e0f35b6dccbd6fd4535ffdfa4c5bdd11ff44fa488a53baa090245
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 358edcfe776e98c69100f01065d5f9ac12452353736180f8bf1d04e240cddc1bafcc43078b949c26ef40709acce3f2ac28bb65fed28a7e45301dd2a9c607a4ac
|
7
|
+
data.tar.gz: 3c6296fd094227654048f8bda301435442d6c0169b12322253ba07b1486a4137549ff4f3f11e7f5f09cd3c12f4a78eb92ba9055ebd99d5b6a4eab452ac4f16db
|
data/CONTRIBUTING.md
CHANGED
@@ -27,7 +27,7 @@ easiest way to contribute.
|
|
27
27
|
* Fork the [repo][].
|
28
28
|
* Create a new branch for your issue: `git checkout -b issue/my-issue`
|
29
29
|
* Lovingly craft your contribution:
|
30
|
-
* `
|
30
|
+
* `bin/setup` to get started
|
31
31
|
* `rake test` to run tests
|
32
32
|
* Make sure that `rake test` passes. Its important, I said it twice.
|
33
33
|
* Add yourself to the contributors section below.
|
data/HISTORY.md
CHANGED
@@ -1,4 +1,21 @@
|
|
1
|
-
# Hitimes
|
1
|
+
# Hitimes Changelog
|
2
|
+
## Version 3.0.0 - 2024-05-01
|
3
|
+
|
4
|
+
* Migrated to SemaphoreCI for doing full test runs on all active ruby versions.
|
5
|
+
* Remove the dependency on `Process.clock_getres` as it is unreliable.
|
6
|
+
* This has the effect of deprecating some Hitimes constants that had been documented as public. These are now removed as this is a major version update
|
7
|
+
- `Hitimes::CLOCK_RESOLUTION_NANOSECONDS`
|
8
|
+
- `Hitimes::CLOCK_RESOLUTION_SECONDS`
|
9
|
+
- `Hitimes::INSTANT_CONVERSION_FACTOR`
|
10
|
+
- `Hitimes.clock_resolution_description`
|
11
|
+
- `Hitimes.clock_description`
|
12
|
+
* Added Rubocop for some coding consistency
|
13
|
+
* Updated the supported ruby version to be 3.0 and up
|
14
|
+
* Updated all dependencies
|
15
|
+
* Changed how all the `assert_delta` style tests were done so they were not so flakey
|
16
|
+
* Hitimes will now emit a `warn` message if it ends up using `CLOCK_REALTIME`
|
17
|
+
* Hitimes will raise an exception if it cannot find a valid clock id. This is a bug and a message to file a report is in the exception
|
18
|
+
|
2
19
|
## Version 2.0.0 2019-09-23
|
3
20
|
|
4
21
|
* Remove the C and Java extensions as `Process.clock_gettime()` has the same
|
@@ -83,7 +100,7 @@
|
|
83
100
|
|
84
101
|
## Version 1.0.3 2009-06-28
|
85
102
|
|
86
|
-
* Fix bug with time.h on linode (reported by Roger Pack)
|
103
|
+
* Fix bug with time.h on linode (reported by Roger Pack)
|
87
104
|
* Fix potential garbage collection issue with Interval class
|
88
105
|
* Windows gem is now a fat binary to support installing in 1.8 or 1.9 from the
|
89
106
|
same gem
|
@@ -112,7 +129,7 @@
|
|
112
129
|
|
113
130
|
* Added new stat 'rate'
|
114
131
|
* Added new stat method to_hash
|
115
|
-
* Added Hitimes::MutexedStats class for threadsafe stats collection
|
132
|
+
* Added Hitimes::MutexedStats class for threadsafe stats collection
|
116
133
|
- not needed when used in MRI 1.8.x
|
117
134
|
* remove stale dependency on mkrf
|
118
135
|
|
data/Manifest.txt
CHANGED
@@ -1,11 +1,9 @@
|
|
1
1
|
CONTRIBUTING.md
|
2
2
|
HISTORY.md
|
3
|
-
LICENSE
|
3
|
+
LICENSE.txt
|
4
4
|
Manifest.txt
|
5
5
|
README.md
|
6
|
-
|
7
|
-
examples/benchmarks.rb
|
8
|
-
examples/stats.rb
|
6
|
+
hitimes.gemspec
|
9
7
|
lib/hitimes.rb
|
10
8
|
lib/hitimes/initialize.rb
|
11
9
|
lib/hitimes/instant.rb
|
@@ -18,16 +16,3 @@ lib/hitimes/timed_metric.rb
|
|
18
16
|
lib/hitimes/timed_value_metric.rb
|
19
17
|
lib/hitimes/value_metric.rb
|
20
18
|
lib/hitimes/version.rb
|
21
|
-
spec/hitimes_spec.rb
|
22
|
-
spec/interval_spec.rb
|
23
|
-
spec/metric_spec.rb
|
24
|
-
spec/mutex_stats_spec.rb
|
25
|
-
spec/paths_spec.rb
|
26
|
-
spec/spec_helper.rb
|
27
|
-
spec/stats_spec.rb
|
28
|
-
spec/timed_metric_spec.rb
|
29
|
-
spec/timed_value_metric_spec.rb
|
30
|
-
spec/value_metric_spec.rb
|
31
|
-
spec/version_spec.rb
|
32
|
-
tasks/default.rake
|
33
|
-
tasks/this.rb
|
data/README.md
CHANGED
@@ -1,17 +1,14 @@
|
|
1
1
|
# Hitimes
|
2
|
-
|
3
|
-
[![Build Status](https://travis-ci.org/copiousfreetime/hitimes.svg?branch=master)](https://travis-ci.org/copiousfreetime/hitimes)
|
4
|
-
|
5
|
-
## Description
|
6
|
-
|
7
|
-
A fast, high resolution timer library for recording peformance metrics.
|
2
|
+
[![Build Status](https://copiousfreetime.semaphoreci.com/badges/hitimes/branches/main.svg)](https://copiousfreetime.semaphoreci.com/projects/hitimes)
|
8
3
|
|
9
4
|
* [Homepage](http://github.com/copiousfreetime/hitimes)
|
10
5
|
* [Github project](http://github.com/copiousfreetime/hitimes)
|
11
|
-
* email jeremy at copiousfreetime dot org
|
12
|
-
* `git clone url git://github.com/copiousfreetime/hitimes.git`
|
13
6
|
|
14
|
-
##
|
7
|
+
## DESCRIPTION
|
8
|
+
|
9
|
+
A fast, high resolution timer library for recording performance metrics.
|
10
|
+
|
11
|
+
## TABLE OF CONTENTS
|
15
12
|
|
16
13
|
* [Requirements](#requirements)
|
17
14
|
* [Usage](#usage)
|
@@ -20,13 +17,13 @@ A fast, high resolution timer library for recording peformance metrics.
|
|
20
17
|
* [License](#license)
|
21
18
|
|
22
19
|
|
23
|
-
##
|
20
|
+
## REQUIREMENTS
|
24
21
|
|
25
22
|
Hitimes requires the following to run:
|
26
23
|
|
27
24
|
* Ruby
|
28
25
|
|
29
|
-
##
|
26
|
+
## USAGE
|
30
27
|
|
31
28
|
Hitimes easiest to use when installed with `rubygems`:
|
32
29
|
|
@@ -37,13 +34,13 @@ gem install hitimes
|
|
37
34
|
Or as part of your bundler `Gemfile`:
|
38
35
|
|
39
36
|
```ruby
|
40
|
-
gem
|
37
|
+
gem "hitimes"
|
41
38
|
```
|
42
39
|
|
43
40
|
You can load it with the standard ruby require statement.
|
44
41
|
|
45
42
|
```ruby
|
46
|
-
require
|
43
|
+
require "hitimes"
|
47
44
|
```
|
48
45
|
|
49
46
|
### Interval
|
@@ -53,10 +50,10 @@ Returns the time as seconds.
|
|
53
50
|
|
54
51
|
```ruby
|
55
52
|
duration = Hitimes::Interval.measure do
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
53
|
+
1_000_000.times do |x|
|
54
|
+
2 + 2
|
55
|
+
end
|
56
|
+
end
|
60
57
|
|
61
58
|
puts duration # => 0.047414297 (seconds)
|
62
59
|
```
|
@@ -66,7 +63,7 @@ puts duration # => 0.047414297 (seconds)
|
|
66
63
|
Use a `Hitimes::TimedMetric` to calculate statistics about an iterative operation
|
67
64
|
|
68
65
|
```ruby
|
69
|
-
timed_metric = Hitimes::TimedMetric.new(
|
66
|
+
timed_metric = Hitimes::TimedMetric.new("operation on items")
|
70
67
|
```
|
71
68
|
|
72
69
|
Explicitly use `start` and `stop`:
|
@@ -84,7 +81,8 @@ value of the block.
|
|
84
81
|
|
85
82
|
```ruby
|
86
83
|
collection.each do |item|
|
87
|
-
result_of_do_something = timed_metric.measure { do_something(
|
84
|
+
result_of_do_something = timed_metric.measure { do_something(item) }
|
85
|
+
# do something with result_of_do_something
|
88
86
|
end
|
89
87
|
```
|
90
88
|
And then look at the stats
|
@@ -96,15 +94,16 @@ puts timed_metric.min
|
|
96
94
|
puts timed_metric.stddev
|
97
95
|
puts timed_metric.rate
|
98
96
|
```
|
97
|
+
|
99
98
|
### ValueMetric
|
100
99
|
|
101
100
|
Use a `Hitimes::ValueMetric` to calculate statistics about measured samples.
|
102
101
|
|
103
102
|
``` ruby
|
104
|
-
value_metric = Hitimes::ValueMetric.new(
|
103
|
+
value_metric = Hitimes::ValueMetric.new("size of thing")
|
105
104
|
loop do
|
106
105
|
# ... do stuff changing sizes of 'thing'
|
107
|
-
value_metric.measure(
|
106
|
+
value_metric.measure(thing.size)
|
108
107
|
# ... do other stuff that may change size of thing
|
109
108
|
end
|
110
109
|
|
@@ -120,12 +119,12 @@ puts value_metric.rate
|
|
120
119
|
Use a `Hitimes::TimedValueMetric` to calculate statistics about batches of samples.
|
121
120
|
|
122
121
|
``` ruby
|
123
|
-
timed_value_metric = Hitimes::TimedValueMetric.new(
|
124
|
-
loop do
|
122
|
+
timed_value_metric = Hitimes::TimedValueMetric.new("batch times")
|
123
|
+
loop do
|
125
124
|
batch = ... # get a batch of things
|
126
125
|
timed_value_metric.start
|
127
126
|
# .. do something with batch
|
128
|
-
timed_value_metric.stop(
|
127
|
+
timed_value_metric.stop(batch.size)
|
129
128
|
end
|
130
129
|
|
131
130
|
puts timed_value_metric.rate
|
@@ -147,46 +146,42 @@ Hitimes uses the internal ruby `Process::clock_gettime()` to
|
|
147
146
|
get the highest granularity time increment possible. Generally this is
|
148
147
|
nanosecond resolution, or whatever the hardware in the CPU supports.
|
149
148
|
|
150
|
-
##
|
149
|
+
## SUPPORT
|
151
150
|
|
152
151
|
Hitimes is supported on whatever versions of ruby are currently supported.
|
153
152
|
Hitimes also follows [semantic versioning](http://semver.org/).
|
154
153
|
|
155
154
|
The current officially supported versions of Ruby are:
|
156
155
|
|
157
|
-
* MRI Ruby (all platforms)
|
158
|
-
* JRuby 9.
|
156
|
+
* MRI Ruby (all platforms) 3.0 - current
|
157
|
+
* JRuby 9.4.x.x
|
158
|
+
* Truffleruby 24
|
159
159
|
|
160
|
-
Unofficially supported versions, any version of MRI from Ruby 2.1 and up.
|
160
|
+
Unofficially supported versions, any version of MRI from Ruby 2.1 and up. Since
|
161
161
|
the C Extension has been removed Hitimes should work with any ruby that is 2.1
|
162
162
|
or greater as that is when `Process.clock_gettime()` was implemented.
|
163
163
|
|
164
164
|
For versions of Ruby before 2.1 please use Hitimes 1.3, the extension code is
|
165
165
|
still in there and they should still work.
|
166
166
|
|
167
|
-
##
|
167
|
+
## CONTRIBUTING
|
168
168
|
|
169
|
-
Please read
|
169
|
+
Please read [CONTRIBUTING.md](CONTRIBUTING.md) for instructions on development
|
170
|
+
and bug reporting.
|
170
171
|
|
171
172
|
## Credits
|
172
173
|
|
173
|
-
* [Bruce Williams](https://github.com/bruce) for suggesting the idea
|
174
|
+
* [Bruce Williams](https://github.com/bruce) for suggesting the idea.
|
175
|
+
* [Benoit Daloze](https://github.com/eregon) and [Thomas Hurst](https://github.com/Freaky) for conversations around clock_ids.
|
174
176
|
|
175
177
|
## License
|
176
178
|
|
177
179
|
Hitimes is licensed under the [ISC](https://opensource.org/licenses/ISC)
|
178
180
|
license.
|
179
181
|
|
180
|
-
|
181
|
-
|
182
|
-
Permission to use, copy, modify, and/or distribute this software for any
|
183
|
-
purpose with or without fee is hereby granted, provided that the above
|
184
|
-
copyright notice and this permission notice appear in all copies.
|
182
|
+
## Related Works
|
185
183
|
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
191
|
-
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
192
|
-
PERFORMANCE OF THIS SOFTWARE.
|
184
|
+
* [monotime](https://github.com/Freaky/monotime) - A sensible interface to Ruby's monotonic clock.
|
185
|
+
* [concurrent-ruby](https://github.com/ruby-concurrency/concurrent-ruby) - [Concurrent.monotonic_time](https://github.com/ruby-concurrency/concurrent-ruby) is a straight pass through to `Process.clock_gettime(Process::CLOCK_MONOTONIC,...)`.
|
186
|
+
* [Instant](https://doc.rust-lang.org/src/std/time.rs.html) - The rust equivalent.
|
187
|
+
* [time.Now](https://pkg.go.dev/time) - The go monotonic time interface is part of this package.
|
data/hitimes.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# DO NOT EDIT - This file is automatically generated
|
2
|
+
# Make changes to Manifest.txt and/or Rakefile and regenerate
|
3
|
+
# -*- encoding: utf-8 -*-
|
4
|
+
# stub: hitimes 3.0.0 ruby lib
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "hitimes".freeze
|
8
|
+
s.version = "3.0.0".freeze
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
11
|
+
s.metadata = { "bug_tracker_uri" => "https://github.com/copiousfreetime/hitimes/issues", "changelog_uri" => "https://github.com/copiousfreetime/hitimes/blob/master/HISTORY.md", "homepage_uri" => "https://github.com/copiousfreetime/hitimes", "source_code_uri" => "https://github.com/copiousfreetime/hitimes" } if s.respond_to? :metadata=
|
12
|
+
s.require_paths = ["lib".freeze]
|
13
|
+
s.authors = ["Jeremy Hinegardner".freeze]
|
14
|
+
s.bindir = "exe".freeze
|
15
|
+
s.date = "2024-05-01"
|
16
|
+
s.description = "A fast, high resolution timer library for recording performance metrics.".freeze
|
17
|
+
s.email = "jeremy@copiousfreetime.org".freeze
|
18
|
+
s.extra_rdoc_files = ["CONTRIBUTING.md".freeze, "HISTORY.md".freeze, "LICENSE.txt".freeze, "Manifest.txt".freeze, "README.md".freeze]
|
19
|
+
s.files = ["CONTRIBUTING.md".freeze, "HISTORY.md".freeze, "LICENSE.txt".freeze, "Manifest.txt".freeze, "README.md".freeze, "hitimes.gemspec".freeze, "lib/hitimes.rb".freeze, "lib/hitimes/initialize.rb".freeze, "lib/hitimes/instant.rb".freeze, "lib/hitimes/interval.rb".freeze, "lib/hitimes/metric.rb".freeze, "lib/hitimes/mutexed_stats.rb".freeze, "lib/hitimes/paths.rb".freeze, "lib/hitimes/stats.rb".freeze, "lib/hitimes/timed_metric.rb".freeze, "lib/hitimes/timed_value_metric.rb".freeze, "lib/hitimes/value_metric.rb".freeze, "lib/hitimes/version.rb".freeze]
|
20
|
+
s.homepage = "http://github.com/copiousfreetime/hitimes".freeze
|
21
|
+
s.licenses = ["ISC".freeze]
|
22
|
+
s.rdoc_options = ["--main".freeze, "README.md".freeze, "--markup".freeze, "tomdoc".freeze]
|
23
|
+
s.required_ruby_version = Gem::Requirement.new(">= 3.0.0".freeze)
|
24
|
+
s.rubygems_version = "3.5.9".freeze
|
25
|
+
s.summary = "A fast, high resolution timer library for recording performance metrics.".freeze
|
26
|
+
end
|
data/lib/hitimes/initialize.rb
CHANGED
@@ -1,64 +1,103 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
+
module Hitimes
|
3
4
|
# Internal: Internal setup that is done when the library is loaded
|
4
5
|
#
|
5
6
|
# We want to determine what clock to use for this machine. So we need to
|
6
|
-
#
|
7
|
+
# introspect the ruby environment and then setup some initial constants. These
|
7
8
|
# methods are used in lib/hitimes/instant.rb to help setup the CLOCK_ID
|
8
|
-
# constant
|
9
|
+
# constant at load time.
|
9
10
|
#
|
10
11
|
module Initialize
|
11
|
-
|
12
|
-
# Internal: Return the list of clock ids, in general priority order,
|
13
|
-
# assuming they all have the same resolution.
|
14
12
|
#
|
15
|
-
#
|
16
|
-
#
|
13
|
+
# After a fair bit of experimentaiton, it seems that the only clock_ids that
|
14
|
+
# are of any use are the following:
|
15
|
+
#
|
16
|
+
# POSIX:
|
17
|
+
#
|
18
|
+
# CLOCK_REALTIME A settable system-wide real-time clock. Measures
|
19
|
+
# wall-clock time. Affected by system jumps in time,
|
20
|
+
# adjtime(3), and NTP.
|
21
|
+
#
|
22
|
+
# CLOCK_MONOTONIC A nonsettable system-wide clock that represent
|
23
|
+
# monotomic time since some unspecified point in the
|
24
|
+
# past. Not affected by jumps in system time, but is
|
25
|
+
# affectd by adjtime(3) and NTP.
|
26
|
+
#
|
27
|
+
# Darwin:
|
28
|
+
#
|
29
|
+
# CLOCK_MONOTONIC_RAW clock that increments monotonically, tracking the
|
30
|
+
# time since an arbitrary point like CLOCK_MONOTONIC.
|
31
|
+
# However, this clock is unaffected by frequency or
|
32
|
+
# time adjustments.
|
33
|
+
#
|
34
|
+
# CLOCK_UPTIME_RAW clock that increments monotonically, in the same manner
|
35
|
+
# as CLOCK_MONOTONIC_RAW, but that does not increment
|
36
|
+
# while the system is asleep. The returned value is
|
37
|
+
# identical to the result of mach_absolute_time()
|
38
|
+
# after the appropriate mach_timebase conversion is applied.
|
39
|
+
#
|
40
|
+
# Linux:
|
41
|
+
#
|
42
|
+
# CLOCK_MONOTONIC_RAW Similar to CLOCK_MONOTONIC, but provides access to
|
43
|
+
# a raw hardware-based time that is not subject to NTP
|
44
|
+
# adjustments or the incremental adjustments performed
|
45
|
+
# by adjtime(3)
|
17
46
|
#
|
18
|
-
#
|
47
|
+
# CLOCK_BOOTTIME Identical to CLOCK_MONOTONIC, except it also includes any
|
48
|
+
# time that the system is suspended.
|
19
49
|
#
|
20
|
-
#
|
21
|
-
|
22
|
-
|
50
|
+
# *BSD:
|
51
|
+
#
|
52
|
+
# All the BSDs seem to have CLOCK_MONOTONIC and CLOCK_REALTIME although on
|
53
|
+
# NetBSD CLOCK_MONOTONIC is not affected by adjtime(2). It is unclear if
|
54
|
+
# they are affected by adjtime(2) on FreeBSD, OpenBSD, or DragonFlyBSD. -
|
55
|
+
# at least according to the man pages.
|
56
|
+
#
|
57
|
+
# What this boils down to as that pretty much all systems have CLOCK_REALTIME
|
58
|
+
# and CLOCK_MONOTONIC. The other clocks are system specific and may or may
|
59
|
+
# not exist. We'll try to use the most accurate clock available.
|
60
|
+
#
|
61
|
+
# So we'll try to use the following clocks in order of preference:
|
62
|
+
#
|
63
|
+
# On Linux and Darwin
|
64
|
+
# CLOCK_MONOTONIC_RAW, CLOCK_MONOTONIC, CLOCK_REALTIME
|
65
|
+
#
|
66
|
+
# Everyone else:
|
67
|
+
# CLOCK_MONOTONIC, CLOCK_REALTIME
|
68
|
+
#
|
69
|
+
# So in reality, well just test for constants on all of the above and use the
|
70
|
+
# first one that exists.
|
71
|
+
#
|
72
|
+
# If CLOCK_REALTIME is chose, we will dump a warning to the user.
|
73
|
+
# And if we can't finde one, which is really, really odd, we'll raise an exception.
|
74
|
+
POTENTIAL_CLOCK_IDS = %i[CLOCK_MONOTONIC_RAW CLOCK_MONOTONIC CLOCK_REALTIME].freeze
|
75
|
+
def determine_clock_id(potential_ids = POTENTIAL_CLOCK_IDS)
|
76
|
+
sym = potential_ids.find { |id| Process.const_defined?(id) }
|
23
77
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
begin
|
28
|
-
Process.clock_getres(:MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC)
|
29
|
-
clock_ids << :MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC
|
30
|
-
rescue Errno::EINVAL
|
31
|
-
# not on OSX
|
32
|
-
end
|
78
|
+
unless sym
|
79
|
+
raise Hitimes::Error, <<~ERROR
|
80
|
+
Unable to find a high resolution clock at all. THIS IS A BUG!!
|
33
81
|
|
34
|
-
|
35
|
-
# all have the same resolution
|
36
|
-
#
|
37
|
-
%i[ CLOCK_MONOTONIC_RAW CLOCK_BOOTTIME CLOCK_MONOTONIC_PRECISE CLOCK_MONOTONIC ].each do |c|
|
38
|
-
clock_ids << Process.const_get(c) if Process.const_defined?(c)
|
39
|
-
end
|
82
|
+
RUBY_DESCRIPTION: #{RUBY_DESCRIPTION}
|
40
83
|
|
84
|
+
Please report this bug to the hitimes issue tracker at
|
85
|
+
https://github.com/copiousfreetime/hitimes/issues
|
86
|
+
ERROR
|
41
87
|
end
|
42
|
-
end
|
43
|
-
module_function :potential_clock_ids
|
44
88
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
#
|
49
|
-
# Get the resolution of each clock id and then return the higest resolution
|
50
|
-
# id from the list
|
51
|
-
#
|
52
|
-
# Returns the clock id to use on this ruby
|
53
|
-
def determine_clock_id
|
54
|
-
ids_and_resolutions = potential_clock_ids.map { |clock_id|
|
55
|
-
[clock_id, Process.clock_getres(clock_id)]
|
56
|
-
}
|
89
|
+
if sym == :CLOCK_REALTIME
|
90
|
+
warn <<~TXT
|
91
|
+
Unable to find a high resolution clock. Using CLOCK_REALTIME for timing.
|
57
92
|
|
58
|
-
|
59
|
-
|
93
|
+
RUBY_DESCRIPTION: #{RUBY_DESCRIPTION}
|
94
|
+
|
95
|
+
Please report the above information to the hitimes issue tracker at
|
96
|
+
https://github.com/copiousfreetime/hitimes/issues
|
97
|
+
TXT
|
98
|
+
end
|
60
99
|
|
61
|
-
|
100
|
+
Process.const_get(sym)
|
62
101
|
end
|
63
102
|
module_function :determine_clock_id
|
64
103
|
end
|
data/lib/hitimes/instant.rb
CHANGED
@@ -1,24 +1,16 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "hitimes/initialize"
|
4
|
+
|
5
|
+
# Hitimes Constants and module methods
|
6
|
+
#
|
3
7
|
module Hitimes
|
4
8
|
# Public: The clock_id to use in Process.clock_gettime
|
5
9
|
CLOCK_ID = Initialize.determine_clock_id.freeze
|
6
10
|
|
7
|
-
# Public: The resolution of the clock
|
8
|
-
CLOCK_RESOLUTION_NANOSECONDS = Process.clock_getres(CLOCK_ID, :nanosecond).freeze
|
9
|
-
|
10
11
|
# Internal: The fraction of second of a nanosecond
|
11
12
|
NANOSECONDS_PER_SECOND = 1e9
|
12
13
|
|
13
|
-
# Public: The smallest fraction of a second hitimes can do
|
14
|
-
CLOCK_RESOLUTION_SECONDS = CLOCK_RESOLUTION_NANOSECONDS / NANOSECONDS_PER_SECOND
|
15
|
-
|
16
|
-
# Public: The factor used to convert the instant values to fractional seconds
|
17
|
-
#
|
18
|
-
# The raw instant values are divided by this value to get float seconds
|
19
|
-
INSTANT_CONVERSION_FACTOR = CLOCK_RESOLUTION_NANOSECONDS * NANOSECONDS_PER_SECOND
|
20
|
-
|
21
|
-
|
22
14
|
# Public: Get the raw instant
|
23
15
|
#
|
24
16
|
# Examples:
|
@@ -39,27 +31,11 @@ module Hitimes
|
|
39
31
|
when Symbol
|
40
32
|
CLOCK_ID.to_s
|
41
33
|
else
|
42
|
-
const = Process.constants.grep(/CLOCK/).find
|
43
|
-
|
44
|
-
|
45
|
-
"Process::#{const
|
34
|
+
const = Process.constants.grep(/CLOCK/).find do |id|
|
35
|
+
Process.const_get(id) == CLOCK_ID
|
36
|
+
end
|
37
|
+
"Process::#{const}"
|
46
38
|
end
|
47
39
|
end
|
48
40
|
module_function :clock_name
|
49
|
-
|
50
|
-
# Internal: The human readable clock resolution
|
51
|
-
#
|
52
|
-
# Returns the clock resolution as a string
|
53
|
-
def clock_resolution_description
|
54
|
-
"#{CLOCK_RESOLUTION_NANOSECONDS}ns"
|
55
|
-
end
|
56
|
-
module_function :clock_resolution_description
|
57
|
-
|
58
|
-
# Internal: The human readable clock description that is used by hitimes
|
59
|
-
#
|
60
|
-
# Returns the clock description as a String
|
61
|
-
def clock_description
|
62
|
-
"#{clock_name} #{clock_resolution_description}"
|
63
|
-
end
|
64
|
-
module_function :clock_description
|
65
41
|
end
|
data/lib/hitimes/interval.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Copyright (c) 2008 Jeremy Hinegardner
|
2
4
|
# All rights reserved. See LICENSE and/or COPYING for details.
|
3
5
|
#
|
@@ -20,7 +22,6 @@ module Hitimes
|
|
20
22
|
# Interval is useful when you only need to track a single interval of time, or
|
21
23
|
# if you do not want to track statistics about an operation.
|
22
24
|
class Interval
|
23
|
-
|
24
25
|
# Public: The integer representing the start instant of the Interval. This
|
25
26
|
# valuea is not useful on its own. It is a platform dependent value.
|
26
27
|
attr_reader :start_instant
|
@@ -48,14 +49,14 @@ module Hitimes
|
|
48
49
|
# Interval.measure { } -> Float
|
49
50
|
#
|
50
51
|
# Times the execution of the block returning the number of seconds it took
|
51
|
-
def self.measure
|
52
|
+
def self.measure
|
52
53
|
raise Error, "No block given to Interval.measure" unless block_given?
|
53
54
|
|
54
|
-
|
55
|
+
interval = Interval.now
|
55
56
|
yield
|
56
|
-
|
57
|
+
interval.stop
|
57
58
|
|
58
|
-
|
59
|
+
interval.duration
|
59
60
|
end
|
60
61
|
|
61
62
|
# call-seq:
|
@@ -65,7 +66,7 @@ module Hitimes
|
|
65
66
|
# start_instant equivalent to the stop_interval of self.
|
66
67
|
def split
|
67
68
|
@stop_instant = ::Hitimes.raw_instant
|
68
|
-
|
69
|
+
Interval.new(@stop_instant)
|
69
70
|
end
|
70
71
|
|
71
72
|
# call-seq:
|
@@ -76,6 +77,7 @@ module Hitimes
|
|
76
77
|
# interval is truely started +true+ is returned otherwise +false+.
|
77
78
|
def start
|
78
79
|
return false if started?
|
80
|
+
|
79
81
|
@start_instant = ::Hitimes.raw_instant
|
80
82
|
true
|
81
83
|
end
|
@@ -92,7 +94,7 @@ module Hitimes
|
|
92
94
|
|
93
95
|
@stop_instant = ::Hitimes.raw_instant
|
94
96
|
|
95
|
-
|
97
|
+
duration
|
96
98
|
end
|
97
99
|
|
98
100
|
# call-seq:
|
@@ -104,8 +106,8 @@ module Hitimes
|
|
104
106
|
def duration_so_far
|
105
107
|
return false unless running?
|
106
108
|
|
107
|
-
|
108
|
-
calculate_duration(@start_instant,
|
109
|
+
raw = Hitimes.raw_instant
|
110
|
+
calculate_duration(@start_instant, raw)
|
109
111
|
end
|
110
112
|
|
111
113
|
# call-seq:
|
@@ -120,7 +122,7 @@ module Hitimes
|
|
120
122
|
# interval.stopped? -> boolean
|
121
123
|
#
|
122
124
|
# returns whether or not the interval has been stopped
|
123
|
-
def
|
125
|
+
def stopped?
|
124
126
|
!!@stop_instant
|
125
127
|
end
|
126
128
|
|
@@ -151,11 +153,9 @@ module Hitimes
|
|
151
153
|
|
152
154
|
return duration_so_far unless stopped?
|
153
155
|
|
154
|
-
|
155
|
-
@duration = calculate_duration(@start_instant, @stop_instant)
|
156
|
-
end
|
156
|
+
@duration = calculate_duration(@start_instant, @stop_instant) if @duration.negative?
|
157
157
|
|
158
|
-
|
158
|
+
@duration
|
159
159
|
end
|
160
160
|
|
161
161
|
alias to_f duration
|
@@ -165,7 +165,7 @@ module Hitimes
|
|
165
165
|
private
|
166
166
|
|
167
167
|
def calculate_duration(start, stop)
|
168
|
-
(stop - start) / ::Hitimes::
|
168
|
+
(stop - start) / ::Hitimes::NANOSECONDS_PER_SECOND
|
169
169
|
end
|
170
170
|
end
|
171
171
|
end
|