metriks 0.9.5 → 0.9.6

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -2,6 +2,8 @@ source :rubygems
2
2
 
3
3
  gemspec
4
4
 
5
+ gem 'rbtree'
6
+
5
7
  group :test do
6
8
  gem 'turn', '0.8.2', :require => false
7
9
  gem 'rake', '0.8.7'
@@ -2,57 +2,91 @@
2
2
 
3
3
  require 'benchmark'
4
4
  require 'metriks'
5
-
6
-
7
- def fib(n)
8
- n < 2 ? n : fib(n-1) + fib(n-2)
9
- end
10
-
11
- uniform_timer = Metriks::Timer.new(Metriks::Histogram.new_uniform)
12
- exponential_timer = Metriks::Timer.new(Metriks::Histogram.new_exponentially_decaying)
5
+ require 'rbtree'
6
+ require 'avl_tree'
7
+ require 'red_black_tree'
13
8
 
14
9
  fib_times = ARGV[0] ? ARGV[0].to_i : 10
15
10
  iter = ARGV[1] ? ARGV[1].to_i : 100000
16
11
 
17
- puts "fib(#{fib_times}): #{iter} iterations"
18
- puts "-" * 50
19
12
 
20
- plain = Benchmark.realtime do
21
- for i in 1..iter
22
- fib(fib_times)
13
+ class TimerBenchmarker
14
+ attr_reader :iter, :fib_times
15
+
16
+ def initialize(fib_times, iter)
17
+ @fib_times = fib_times
18
+ @iter = iter
19
+ @mapping = { :plain => nil }
23
20
  end
24
- end
25
21
 
26
- puts "%15s: %f secs %f secs/call" % [ 'plain', plain, plain / iter ]
22
+ def measure(key, value)
23
+ @mapping[key] = value
24
+ end
27
25
 
28
- uniform = Benchmark.realtime do
29
- for i in 1..iter
30
- uniform_timer.time do
31
- fib(fib_times)
26
+ def run
27
+ @results = {}
28
+ @mapping.each do |key, timer|
29
+ @results[key] = Benchmark.realtime do
30
+ if timer
31
+ for i in 1..iter
32
+ timer.time do
33
+ fib(fib_times)
34
+ end
35
+ end
36
+ else
37
+ for i in 1..iter
38
+ fib(fib_times)
39
+ end
40
+ end
41
+ end
32
42
  end
43
+ report
33
44
  end
34
- end
35
45
 
36
- puts "%15s: %f secs %f secs/call -- %.1f%% slower than plain (%f secs/call)" % [
37
- 'uniform', uniform, uniform / iter,
38
- (uniform - plain) / plain * 100 ,
39
- (uniform - plain) / iter,
40
- ]
46
+ def report
47
+ results = @results.sort_by { |k,v| v }
48
+ results.each_with_index do |(name, time), idx|
49
+ puts "%23s: %f secs %f secs/call" % [
50
+ name, time, time / iter
51
+ ]
41
52
 
42
- exponential = Benchmark.realtime do
43
- for i in 1..iter
44
- exponential_timer.time do
45
- fib(fib_times)
53
+ if idx > 0
54
+ prev_name, prev_time = results[idx - 1]
55
+ puts "#{' ' * 25} - %.1f%% slower than %s (%f secs/call)" % [
56
+ (time - prev_time) / prev_time * 100, prev_name,
57
+ (time - prev_time) / iter
58
+ ]
59
+ end
60
+
61
+ if idx > 1
62
+ plain_name, plain_time = results[0]
63
+ puts "#{' ' * 25} - %.1f%% slower than %s (%f secs/call)" % [
64
+ (time - plain_time) / plain_time * 100, plain_name,
65
+ (time - plain_time) / iter
66
+ ]
67
+ end
46
68
  end
47
69
  end
70
+
71
+ def fib(n)
72
+ n < 2 ? n : fib(n-1) + fib(n-2)
73
+ end
48
74
  end
49
75
 
50
- puts "%15s: %f secs %f secs/call -- %.1f%% slower than plain (%f secs/call) -- %.1f%% slower than uniform (%f secs/call)" % [
51
- 'exponential', exponential, exponential / iter,
52
- (exponential - plain) / plain * 100 ,
53
- (exponential - plain) / iter,
54
- (exponential - uniform) / uniform * 100 ,
55
- (exponential - uniform) / iter
56
- ]
76
+ reporter = TimerBenchmarker.new(fib_times, iter)
77
+
78
+ reporter.measure :uniform, Metriks::Timer.new(Metriks::Histogram.new_uniform)
79
+
80
+ reporter.measure :exponential, Metriks::Timer.new(Metriks::ExponentiallyDecayingSample.new(
81
+ Metriks::Histogram::DEFAULT_SAMPLE_SIZE, Metriks::Histogram::DEFAULT_ALPHA, RBTree.new))
57
82
 
83
+ reporter.measure :exponential_avl, Metriks::Timer.new(Metriks::ExponentiallyDecayingSample.new(
84
+ Metriks::Histogram::DEFAULT_SAMPLE_SIZE, Metriks::Histogram::DEFAULT_ALPHA, AVLTree.new))
85
+
86
+ reporter.measure :exponential_red_black, Metriks::Timer.new(Metriks::ExponentiallyDecayingSample.new(
87
+ Metriks::Histogram::DEFAULT_SAMPLE_SIZE, Metriks::Histogram::DEFAULT_ALPHA, RedBlackTree.new))
88
+
89
+ puts "fib(#{fib_times}): #{iter} iterations"
90
+ puts "-" * 50
58
91
 
92
+ reporter.run
data/lib/metriks.rb CHANGED
@@ -1,6 +1,6 @@
1
1
 
2
2
  module Metriks
3
- VERSION = '0.9.5'
3
+ VERSION = '0.9.6'
4
4
 
5
5
  def self.get(name)
6
6
  Metriks::Registry.default.get(name)
@@ -1,13 +1,13 @@
1
1
  require 'atomic'
2
- require 'rbtree'
2
+ require 'red_black_tree'
3
3
  require 'metriks/snapshot'
4
4
 
5
5
  module Metriks
6
6
  class ExponentiallyDecayingSample
7
7
  RESCALE_THRESHOLD = 60 * 60 # 1 hour
8
8
 
9
- def initialize(reservoir_size, alpha)
10
- @values = RBTree.new
9
+ def initialize(reservoir_size, alpha, values = nil)
10
+ @values = values || RedBlackTree.new
11
11
  @count = Atomic.new(0)
12
12
  @next_scale_time = Atomic.new(0)
13
13
  @alpha = alpha
data/metriks.gemspec CHANGED
@@ -13,8 +13,8 @@ Gem::Specification.new do |s|
13
13
  ## If your rubyforge_project name is different, then edit it and comment out
14
14
  ## the sub! line in the Rakefile
15
15
  s.name = 'metriks'
16
- s.version = '0.9.5'
17
- s.date = '2012-03-14'
16
+ s.version = '0.9.6'
17
+ s.date = '2012-03-19'
18
18
 
19
19
  ## Make sure your summary is short. The description may be as long
20
20
  ## as you like.
@@ -41,11 +41,11 @@ Gem::Specification.new do |s|
41
41
  ## that are needed for an end user to actually USE your code.
42
42
  s.add_dependency('atomic', ["~> 1.0"])
43
43
  s.add_dependency('hitimes', [ "~> 1.1"])
44
- s.add_dependency('rbtree', [ "~> 0.3" ])
44
+ s.add_dependency('avl_tree', [ "~> 1.1.1" ])
45
45
 
46
46
  ## List your development dependencies here. Development dependencies are
47
47
  ## those that are only needed during development
48
- s.add_development_dependency('tomdoc', ["~> 0.2"])
48
+ # s.add_development_dependency('tomdoc', ["~> 0.2"])
49
49
  s.add_development_dependency('mocha', ['~> 0.10'])
50
50
 
51
51
  ## Leave this section as-is. It will be automatically generated from the
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 9
8
- - 5
9
- version: 0.9.5
8
+ - 6
9
+ version: 0.9.6
10
10
  platform: ruby
11
11
  authors:
12
12
  - Eric Lindvall
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2012-03-14 00:00:00 -07:00
17
+ date: 2012-03-19 00:00:00 -07:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -44,35 +44,23 @@ dependencies:
44
44
  type: :runtime
45
45
  version_requirements: *id002
46
46
  - !ruby/object:Gem::Dependency
47
- name: rbtree
47
+ name: avl_tree
48
48
  prerelease: false
49
49
  requirement: &id003 !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - ~>
52
52
  - !ruby/object:Gem::Version
53
53
  segments:
54
- - 0
55
- - 3
56
- version: "0.3"
54
+ - 1
55
+ - 1
56
+ - 1
57
+ version: 1.1.1
57
58
  type: :runtime
58
59
  version_requirements: *id003
59
- - !ruby/object:Gem::Dependency
60
- name: tomdoc
61
- prerelease: false
62
- requirement: &id004 !ruby/object:Gem::Requirement
63
- requirements:
64
- - - ~>
65
- - !ruby/object:Gem::Version
66
- segments:
67
- - 0
68
- - 2
69
- version: "0.2"
70
- type: :development
71
- version_requirements: *id004
72
60
  - !ruby/object:Gem::Dependency
73
61
  name: mocha
74
62
  prerelease: false
75
- requirement: &id005 !ruby/object:Gem::Requirement
63
+ requirement: &id004 !ruby/object:Gem::Requirement
76
64
  requirements:
77
65
  - - ~>
78
66
  - !ruby/object:Gem::Version
@@ -81,7 +69,7 @@ dependencies:
81
69
  - 10
82
70
  version: "0.10"
83
71
  type: :development
84
- version_requirements: *id005
72
+ version_requirements: *id004
85
73
  description: An experimental metrics client.
86
74
  email: eric@sevenscale.com
87
75
  executables: []