hitimes 1.2.2 → 1.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/HISTORY.md +6 -0
- data/LICENSE +1 -1
- data/Manifest.txt +0 -1
- data/README.md +15 -19
- data/Rakefile +6 -4
- data/ext/hitimes/c/extconf.rb +1 -1
- data/lib/hitimes.rb +14 -6
- data/lib/hitimes/version.rb +1 -1
- data/tasks/default.rake +16 -50
- data/tasks/extension.rake +2 -2
- data/tasks/this.rb +11 -19
- metadata +27 -14
- data/.travis.yml +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 67f73e078163efeb8791898a667d8ad447520cce
|
4
|
+
data.tar.gz: 234afc5cb57d3a3e2db68e72c809888ceab0c1d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 06b8f4f43947563014bd3b941da25181d6deb9a58cf6efcb915e327a326bb52828f4c6d5098e1008d521e001deafd5a7e476bc8174c45f8d6b273423a39aeb20
|
7
|
+
data.tar.gz: 1f9a2f236f9b6d98dce3822c36f3fba7f0c2844b21a509ec281d631cf605638f387ede6d10aebe595600b204cd7ac7c69d8292ec010423434486c58dc9712d9a
|
data/HISTORY.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# Hitimes Changelog
|
2
2
|
|
3
|
+
## Version 1.2.3 2015-09-13
|
4
|
+
|
5
|
+
* Release new fatbinary version for windows
|
6
|
+
* Update README to indicate duration units
|
7
|
+
* Provide a more friendly error message if the gem is not installed correctly
|
8
|
+
|
3
9
|
## Version 1.2.2 2014-07-09
|
4
10
|
|
5
11
|
* fix compilation issue with clock_gettime in libc (reported by eradman and virtualfunction)
|
data/LICENSE
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
ISC LICENSE - http://opensource.org/licenses/isc-license.txt
|
2
2
|
|
3
|
-
Copyright (c) 2008-
|
3
|
+
Copyright (c) 2008-2015 Jeremy Hinegardner
|
4
4
|
|
5
5
|
Permission to use, copy, modify, and/or distribute this software for any
|
6
6
|
purpose with or without fee is hereby granted, provided that the above
|
data/Manifest.txt
CHANGED
data/README.md
CHANGED
@@ -13,7 +13,7 @@
|
|
13
13
|
|
14
14
|
Hitimes is a fast, high resolution timer library for recording
|
15
15
|
performance metrics. It uses the appropriate low method calls for each
|
16
|
-
system to get the highest granularity time increments possible.
|
16
|
+
system to get the highest granularity time increments possible.
|
17
17
|
|
18
18
|
It currently supports any of the following systems:
|
19
19
|
|
@@ -30,14 +30,17 @@ using `Process.times`.
|
|
30
30
|
|
31
31
|
### Interval
|
32
32
|
|
33
|
-
Use Hitimes::Interval to calculate only the duration of a block of code
|
33
|
+
Use Hitimes::Interval to calculate only the duration of a block of code. Returns
|
34
|
+
the time as seconds.
|
34
35
|
|
35
36
|
``` ruby
|
36
37
|
duration = Hitimes::Interval.measure do
|
37
|
-
|
38
|
+
1_000_000.times do |x|
|
39
|
+
2 + 2
|
40
|
+
end
|
38
41
|
end
|
39
42
|
|
40
|
-
puts duration
|
43
|
+
puts duration # => 0.047414297 (seconds)
|
41
44
|
```
|
42
45
|
|
43
46
|
### TimedMetric
|
@@ -126,21 +129,14 @@ Read the HISTORY.md file.
|
|
126
129
|
|
127
130
|
## BUILDING FOR WINDOWS
|
128
131
|
|
129
|
-
|
130
|
-
the windows version. For me, on OSX to cross compile the process is:
|
132
|
+
This is done using https://github.com/rake-compiler/rake-compiler-dock
|
131
133
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
% rvm use 1.8.7@hitimes
|
139
|
-
% rake-compiler cross-ruby VERSION=1.8.7-p371
|
140
|
-
|
141
|
-
# This only works via 1.8.7 at the current moment
|
142
|
-
% rake cross native gem RUBY_CC_VERSION=1.8.7:1.9.3:2.0.0
|
143
|
-
```
|
134
|
+
1. have VirtualBox installed
|
135
|
+
2. Install boot2docker `brew install boot2docker`
|
136
|
+
3. `gem install rake-compiler-dock`
|
137
|
+
4. `rake-compiler-dock`
|
138
|
+
5. `bundle`
|
139
|
+
6 `rake cross native gem`
|
144
140
|
|
145
141
|
## CREDITS
|
146
142
|
|
@@ -148,7 +144,7 @@ the windows version. For me, on OSX to cross compile the process is:
|
|
148
144
|
|
149
145
|
## ISC License
|
150
146
|
|
151
|
-
Copyright (c) 2008-
|
147
|
+
Copyright (c) 2008-2015 Jeremy Hinegardner
|
152
148
|
|
153
149
|
Permission to use, copy, modify, and/or distribute this software for any
|
154
150
|
purpose with or without fee is hereby granted, provided that the above
|
data/Rakefile
CHANGED
@@ -7,11 +7,12 @@ This.email = "jeremy@copiousfreetime.org"
|
|
7
7
|
This.homepage = "http://github.com/copiousfreetime/#{ This.name }"
|
8
8
|
|
9
9
|
This.ruby_gemspec do |spec|
|
10
|
-
spec.add_development_dependency( 'rake' , '~> 10.
|
11
|
-
spec.add_development_dependency( 'minitest' , '~> 5.
|
12
|
-
spec.add_development_dependency( 'rdoc' , '~> 4.
|
13
|
-
spec.add_development_dependency( 'json' , '~> 1.
|
10
|
+
spec.add_development_dependency( 'rake' , '~> 10.4')
|
11
|
+
spec.add_development_dependency( 'minitest' , '~> 5.5' )
|
12
|
+
spec.add_development_dependency( 'rdoc' , '~> 4.2' )
|
13
|
+
spec.add_development_dependency( 'json' , '~> 1.8' )
|
14
14
|
spec.add_development_dependency( 'rake-compiler', '~> 0.9' )
|
15
|
+
spec.add_development_dependency( 'simplecov' , '~> 0.9' )
|
15
16
|
|
16
17
|
spec.extensions.concat This.extension_conf_files
|
17
18
|
spec.license = "ISC"
|
@@ -19,6 +20,7 @@ end
|
|
19
20
|
|
20
21
|
This.java_gemspec( This.ruby_gemspec ) do |spec|
|
21
22
|
spec.extensions.clear
|
23
|
+
spec.files << "lib/hitimes/hitimes.jar"
|
22
24
|
end
|
23
25
|
|
24
26
|
load 'tasks/default.rake'
|
data/ext/hitimes/c/extconf.rb
CHANGED
@@ -4,7 +4,7 @@ require 'mkmf'
|
|
4
4
|
if RbConfig::CONFIG['host_os'] =~ /darwin/ then
|
5
5
|
$CFLAGS += " -DUSE_INSTANT_OSX=1 -Wall"
|
6
6
|
$LDFLAGS += " -framework CoreServices"
|
7
|
-
elsif RbConfig::CONFIG['host_os'] =~ /
|
7
|
+
elsif RbConfig::CONFIG['host_os'] =~ /win(32|64)/ or RbConfig::CONFIG['host_os'] =~ /mingw/ then
|
8
8
|
$CFLAGS += " -DUSE_INSTANT_WINDOWS=1"
|
9
9
|
else
|
10
10
|
if have_library("rt", "clock_gettime") then
|
data/lib/hitimes.rb
CHANGED
@@ -29,13 +29,21 @@ require 'hitimes/version'
|
|
29
29
|
# Load the binary extension, try loading one for the specific version of ruby
|
30
30
|
# and if that fails, then fall back to one in the top of the library.
|
31
31
|
# this is the method recommended by rake-compiler
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
32
|
+
|
33
|
+
attempts = [
|
34
|
+
"hitimes/#{RUBY_VERSION.sub(/\.\d$/,'')}/hitimes",
|
35
|
+
"hitimes/hitimes"
|
36
|
+
]
|
37
|
+
loaded = false
|
38
|
+
|
39
|
+
attempts.each do |path|
|
40
|
+
begin
|
41
|
+
require path
|
42
|
+
loaded = true
|
43
|
+
rescue LoadError
|
44
|
+
end
|
38
45
|
end
|
46
|
+
raise LoadError, "Unable to find binary extension, was hitimes installed correctly?" unless loaded
|
39
47
|
|
40
48
|
require 'hitimes/stats'
|
41
49
|
require 'hitimes/mutexed_stats'
|
data/lib/hitimes/version.rb
CHANGED
data/tasks/default.rake
CHANGED
@@ -10,21 +10,12 @@ namespace :develop do
|
|
10
10
|
|
11
11
|
# Install all the development and runtime dependencies of this gem using the
|
12
12
|
# gemspec.
|
13
|
-
task :default do
|
13
|
+
task :default => 'Gemfile' do
|
14
14
|
require 'rubygems/dependency_installer'
|
15
15
|
installer = ::Gem::DependencyInstaller.new
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
puts "Installing gem depedencies needed for development"
|
20
|
-
This.platform_gemspec.dependencies.each do |dep|
|
21
|
-
if dep.matching_specs.empty? then
|
22
|
-
puts "Installing : #{dep}"
|
23
|
-
installer.install dep
|
24
|
-
else
|
25
|
-
puts "Skipping : #{dep} -> already installed #{dep.matching_specs.first.full_name}"
|
26
|
-
end
|
27
|
-
end
|
16
|
+
puts "Installing bundler..."
|
17
|
+
installer.install 'bundler'
|
18
|
+
sh 'bundle install'
|
28
19
|
puts "\n\nNow run 'rake test'"
|
29
20
|
end
|
30
21
|
|
@@ -37,14 +28,6 @@ namespace :develop do
|
|
37
28
|
f.puts 'gemspec'
|
38
29
|
end
|
39
30
|
end
|
40
|
-
|
41
|
-
desc "Create a bundler Gemfile"
|
42
|
-
task :using_bundler => 'Gemfile' do
|
43
|
-
puts "Now you can 'bundle'"
|
44
|
-
end
|
45
|
-
|
46
|
-
# Gemfiles are build artifacts
|
47
|
-
CLOBBER << FileList['Gemfile*']
|
48
31
|
end
|
49
32
|
desc "Boostrap development"
|
50
33
|
task :develop => "develop:default"
|
@@ -90,31 +73,16 @@ end
|
|
90
73
|
# Coverage - optional code coverage, rcov for 1.8 and simplecov for 1.9, so
|
91
74
|
# for the moment only rcov is listed.
|
92
75
|
#------------------------------------------------------------------------------
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
t.verbose = true
|
100
|
-
t.rcov_opts << "-x ^/" # remove all the global files
|
101
|
-
t.rcov_opts << "--sort coverage" # so we see the worst files at the top
|
102
|
-
end
|
103
|
-
rescue LoadError
|
104
|
-
This.task_warning( 'rcov' )
|
105
|
-
end
|
106
|
-
else
|
107
|
-
begin
|
108
|
-
require 'simplecov'
|
109
|
-
desc 'Run tests with code coverage'
|
110
|
-
task :coverage do
|
111
|
-
ENV['COVERAGE'] = 'true'
|
112
|
-
Rake::Task[:test].invoke
|
113
|
-
end
|
114
|
-
CLOBBER << FileList["coverage"] if File.directory?( "coverage" )
|
115
|
-
rescue LoadError
|
116
|
-
This.task_warning( 'simplecov' )
|
76
|
+
begin
|
77
|
+
require 'simplecov'
|
78
|
+
desc 'Run tests with code coverage'
|
79
|
+
task :coverage do
|
80
|
+
ENV['COVERAGE'] = 'true'
|
81
|
+
Rake::Task[:test].execute
|
117
82
|
end
|
83
|
+
CLOBBER << 'coverage' if File.directory?('coverage')
|
84
|
+
rescue LoadError
|
85
|
+
This.task_warning( 'simplecov' )
|
118
86
|
end
|
119
87
|
|
120
88
|
#------------------------------------------------------------------------------
|
@@ -179,9 +147,10 @@ namespace :fixme do
|
|
179
147
|
end
|
180
148
|
|
181
149
|
def outdated_fixme_files
|
182
|
-
local_fixme_files.
|
150
|
+
local_fixme_files.select do |local|
|
183
151
|
upstream = fixme_project_path( local )
|
184
|
-
|
152
|
+
upstream.exist? &&
|
153
|
+
( Digest::SHA256.file( local ) != Digest::SHA256.file( upstream ) )
|
185
154
|
end
|
186
155
|
end
|
187
156
|
|
@@ -231,9 +200,6 @@ task :gemspec do
|
|
231
200
|
end
|
232
201
|
end
|
233
202
|
|
234
|
-
# the gemspec is also a dev artifact and should not be kept around.
|
235
|
-
CLOBBER << This.gemspec_file.to_s
|
236
|
-
|
237
203
|
# .rbc files from ruby 2.0
|
238
204
|
CLOBBER << FileList["**/*.rbc"]
|
239
205
|
|
data/tasks/extension.rake
CHANGED
@@ -24,7 +24,7 @@ begin
|
|
24
24
|
ext.gem_spec = This.ruby_gemspec
|
25
25
|
|
26
26
|
ext.cross_compile = true # enable cross compilation (requires cross compile toolchain)
|
27
|
-
ext.cross_platform = 'i386-
|
27
|
+
ext.cross_platform = 'i386-mingw32' # forces the Windows platform instead of the default one
|
28
28
|
# configure options only for cross compile
|
29
29
|
end
|
30
30
|
end
|
@@ -35,4 +35,4 @@ rescue LoadError
|
|
35
35
|
end
|
36
36
|
|
37
37
|
CLOBBER << FileList["lib/**/*.{jar,so,bundle}"]
|
38
|
-
CLOBBER << FileList["lib/#{This.name}/{1.8,1.9,2.0}/"]
|
38
|
+
CLOBBER << FileList["lib/#{This.name}/{1.8,1.9,2.0,2.1,2.2}/"]
|
data/tasks/this.rb
CHANGED
@@ -13,7 +13,7 @@ class ThisProject
|
|
13
13
|
attr_accessor :email
|
14
14
|
|
15
15
|
# The homepage of this project
|
16
|
-
attr_accessor :homepage
|
16
|
+
attr_accessor :homepage
|
17
17
|
|
18
18
|
# The regex of files to exclude from the manifest
|
19
19
|
attr_accessor :exclude_from_manifest
|
@@ -25,7 +25,11 @@ class ThisProject
|
|
25
25
|
#
|
26
26
|
# Yields self
|
27
27
|
def initialize(&block)
|
28
|
-
@exclude_from_manifest =
|
28
|
+
@exclude_from_manifest = Regexp.union(/\.(git|DS_Store)/,
|
29
|
+
/^(doc|coverage|pkg|tmp|Gemfile(\.lock)?)/,
|
30
|
+
/^[^\/]+\.gemspec/,
|
31
|
+
/\.(swp|jar|bundle|so|rvmrc|travis.yml)$/,
|
32
|
+
/~$/)
|
29
33
|
@gemspecs = Hash.new
|
30
34
|
yield self if block_given?
|
31
35
|
end
|
@@ -119,7 +123,7 @@ class ThisProject
|
|
119
123
|
|
120
124
|
# Internal: Returns the gemspace associated with the current ruby platform
|
121
125
|
def platform_gemspec
|
122
|
-
gemspecs
|
126
|
+
gemspecs.fetch(platform) { This.ruby_gemspec }
|
123
127
|
end
|
124
128
|
|
125
129
|
def core_gemspec
|
@@ -141,6 +145,8 @@ class ThisProject
|
|
141
145
|
spec.extra_rdoc_files += spec.files.grep(/(txt|rdoc|md)$/)
|
142
146
|
spec.rdoc_options = [ "--main" , 'README.md',
|
143
147
|
"--markup", "tomdoc" ]
|
148
|
+
|
149
|
+
spec.required_ruby_version = '>= 1.9.3'
|
144
150
|
end
|
145
151
|
end
|
146
152
|
|
@@ -167,20 +173,6 @@ class ThisProject
|
|
167
173
|
return spec
|
168
174
|
end
|
169
175
|
|
170
|
-
# Internal: Set the recovery gem development dependency
|
171
|
-
#
|
172
|
-
# These are dynamically set since they cannot be hard coded as there is
|
173
|
-
# no way to ship them correctly in the gemspec
|
174
|
-
#
|
175
|
-
# Returns nothing.
|
176
|
-
def set_coverage_gem
|
177
|
-
if RUBY_VERSION < "1.9.0"
|
178
|
-
platform_gemspec.add_development_dependency( 'rcov', '~> 1.0.0' )
|
179
|
-
else
|
180
|
-
platform_gemspec.add_development_dependency( 'simplecov', '~> 0.8.2' )
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
176
|
# Internal: Return the platform of ThisProject at the current moment in time.
|
185
177
|
def platform
|
186
178
|
(RUBY_PLATFORM == "java") ? 'java' : Gem::Platform::RUBY
|
@@ -190,8 +182,8 @@ class ThisProject
|
|
190
182
|
def description_section
|
191
183
|
section_of( 'README.md', 'DESCRIPTION')
|
192
184
|
end
|
193
|
-
|
194
|
-
|
185
|
+
|
186
|
+
# Internal: Return the summary text from the README
|
195
187
|
def summary
|
196
188
|
description_section.first
|
197
189
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hitimes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy Hinegardner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-09-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -16,56 +16,56 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '10.
|
19
|
+
version: '10.4'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '10.
|
26
|
+
version: '10.4'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: minitest
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '5.
|
33
|
+
version: '5.5'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '5.
|
40
|
+
version: '5.5'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rdoc
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '4.
|
47
|
+
version: '4.2'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '4.
|
54
|
+
version: '4.2'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: json
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 1.
|
61
|
+
version: '1.8'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 1.
|
68
|
+
version: '1.8'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rake-compiler
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -80,9 +80,23 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0.9'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: simplecov
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0.9'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0.9'
|
83
97
|
description: 'Hitimes is a fast, high resolution timer library for recording performance
|
84
98
|
metrics. It uses the appropriate low method calls for each system to get the highest
|
85
|
-
granularity time increments possible.
|
99
|
+
granularity time increments possible. It currently supports any of the following
|
86
100
|
systems: * any system with the POSIX call `clock_gettime()` * Mac OS X * Windows
|
87
101
|
* JRuby Using Hitimes can be faster than using a series of `Time.new` calls, and
|
88
102
|
it will have a much higher granularity. It is definitely faster than using `Process.times`.'
|
@@ -96,7 +110,6 @@ extra_rdoc_files:
|
|
96
110
|
- Manifest.txt
|
97
111
|
- README.md
|
98
112
|
files:
|
99
|
-
- ".travis.yml"
|
100
113
|
- CONTRIBUTING.md
|
101
114
|
- HISTORY.md
|
102
115
|
- LICENSE
|
@@ -157,7 +170,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
157
170
|
requirements:
|
158
171
|
- - ">="
|
159
172
|
- !ruby/object:Gem::Version
|
160
|
-
version:
|
173
|
+
version: 1.9.3
|
161
174
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
175
|
requirements:
|
163
176
|
- - ">="
|
@@ -165,7 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
165
178
|
version: '0'
|
166
179
|
requirements: []
|
167
180
|
rubyforge_project:
|
168
|
-
rubygems_version: 2.
|
181
|
+
rubygems_version: 2.4.5
|
169
182
|
signing_key:
|
170
183
|
specification_version: 4
|
171
184
|
summary: Hitimes is a fast, high resolution timer library for recording performance
|