vuf 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/vuf/profiler.rb +93 -0
- data/lib/vuf/version.rb +1 -1
- data/test/lib/vuf/profiler_test.rb +15 -0
- metadata +4 -1
data/lib/vuf/profiler.rb
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
module Vuf
|
2
|
+
class Profiler
|
3
|
+
def initialize
|
4
|
+
@mutex = Mutex.new
|
5
|
+
@delay =
|
6
|
+
@stats = {:counter => {}, :time => {}, :avtime => {}}
|
7
|
+
@timers = {}
|
8
|
+
@enable = false
|
9
|
+
end
|
10
|
+
|
11
|
+
def enable ; @enable = true ; end
|
12
|
+
def disable ; @enable = false ; end
|
13
|
+
|
14
|
+
def count(label)
|
15
|
+
@mutex.synchronize {
|
16
|
+
@stats[:counter][label] ||= 0
|
17
|
+
@stats[:counter][label] += 1
|
18
|
+
}
|
19
|
+
end
|
20
|
+
def start(label)
|
21
|
+
@mutex.synchronize { @timers[[Thread.current,label]] = Time.new }
|
22
|
+
end
|
23
|
+
|
24
|
+
def stop(label)
|
25
|
+
new_time = Time.new
|
26
|
+
@mutex.synchronize {
|
27
|
+
time = @timers.delete([Thread.current,label])
|
28
|
+
if time
|
29
|
+
@stats[:time][label] ||= []
|
30
|
+
@stats[:time][label] << new_time - time
|
31
|
+
end
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def result
|
36
|
+
counter_stat = [] ; time_stat = []
|
37
|
+
error = nil
|
38
|
+
@mutex.synchronize {
|
39
|
+
begin
|
40
|
+
@stats[:counter].each{|k,v| counter_stat << "#{k} => #{v.to_s.rjust(10,' ')}" }
|
41
|
+
@stats[:time].each{ |k,v|
|
42
|
+
# retrieve previous av_time and number of mesures (nbdata)
|
43
|
+
av_time,nbdata = @stats[:avtime][k]
|
44
|
+
# Init values if not already done
|
45
|
+
av_time ||= 0 ; nbdata ||= 0
|
46
|
+
# retrieve cumultime from previous average time
|
47
|
+
cumul_time = av_time * nbdata
|
48
|
+
unless v.nil?
|
49
|
+
v.each{|time| cumul_time += time}
|
50
|
+
# increase number of mesures with number of new mesure
|
51
|
+
nbdata += v.size
|
52
|
+
end
|
53
|
+
av_time = cumul_time / nbdata
|
54
|
+
time_stat << "#{k.to_s.rjust(20,' ')} => #{av_time.round(8).to_s.rjust(12,' ')} s/op " +
|
55
|
+
"[#{nbdata.to_s.rjust(12,' ')} op| #{(nbdata*av_time).round(2).to_s.rjust(8,' ')} s]"
|
56
|
+
@stats[:avtime][k] = [av_time,nbdata]
|
57
|
+
@stats[:time][k] = nil
|
58
|
+
}
|
59
|
+
rescue => e
|
60
|
+
Logger.error {"Error in statistic #{e.message}\n#{e.backtrace.join("\n")}"}
|
61
|
+
error = e
|
62
|
+
end
|
63
|
+
}
|
64
|
+
raise error if error
|
65
|
+
[counter_stat, time_stat].flatten.join("\n - ")
|
66
|
+
end
|
67
|
+
|
68
|
+
def finalize
|
69
|
+
return if @stat_thread.nil? || !@stat_thread.alive?
|
70
|
+
@running = false
|
71
|
+
@stat_thread.wakeup
|
72
|
+
@stat_thread.join
|
73
|
+
@stat_thread=nil
|
74
|
+
end
|
75
|
+
|
76
|
+
def run(delay=10)
|
77
|
+
return if @stat_thread
|
78
|
+
|
79
|
+
@stat_thread = Thread.new do
|
80
|
+
enable ; GC::Profiler.enable ; @running = true
|
81
|
+
while @running
|
82
|
+
start('total') ; sleep(delay) ; stop('total')
|
83
|
+
gc_result = [] ; GC::Profiler.result.each_line{|l| gc_result << l}
|
84
|
+
Logger.info "Profiling Result : \n - #{result}\n#{gc_result.shift}#{gc_result.first}#{gc_result.last}"
|
85
|
+
end
|
86
|
+
GC::Profiler.disable ; disable
|
87
|
+
end
|
88
|
+
# Ensure that finaliz was call at exit
|
89
|
+
Kernel.at_exit { finalize }
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
end
|
data/lib/vuf/version.rb
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
require_relative '../../test_helper'
|
2
|
+
|
3
|
+
describe Vuf::Profiler do
|
4
|
+
subject { Vuf::Profiler.new }
|
5
|
+
|
6
|
+
it "must parse options without errors" do
|
7
|
+
subject.run(0.1)
|
8
|
+
10000.times do
|
9
|
+
subject.start('test')
|
10
|
+
sleep(rand(10)/1000)
|
11
|
+
subject.stop('test')
|
12
|
+
end
|
13
|
+
subject.finalize
|
14
|
+
end
|
15
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vuf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -59,10 +59,12 @@ files:
|
|
59
59
|
- lib/vuf/batch.rb
|
60
60
|
- lib/vuf/logger.rb
|
61
61
|
- lib/vuf/pool.rb
|
62
|
+
- lib/vuf/profiler.rb
|
62
63
|
- lib/vuf/version.rb
|
63
64
|
- lib/vuf/working_pool.rb
|
64
65
|
- test/lib/vuf/batch_test.rb
|
65
66
|
- test/lib/vuf/pool_test.rb
|
67
|
+
- test/lib/vuf/profiler_test.rb
|
66
68
|
- test/lib/vuf/wp_test.rb
|
67
69
|
- test/test_helper.rb
|
68
70
|
- test/tmp/.gitignore
|
@@ -96,6 +98,7 @@ summary: This gem provide usefulle patterns like workingpool, batch executor, ob
|
|
96
98
|
test_files:
|
97
99
|
- test/lib/vuf/batch_test.rb
|
98
100
|
- test/lib/vuf/pool_test.rb
|
101
|
+
- test/lib/vuf/profiler_test.rb
|
99
102
|
- test/lib/vuf/wp_test.rb
|
100
103
|
- test/test_helper.rb
|
101
104
|
- test/tmp/.gitignore
|