Class: Timify

Inherits:
Object
  • Object
show all
Defined in:
lib/timify.rb

Overview

Calculates the time running from one location to another inside your code. More info: github.com/MarioRuiz/timify/

attr_accessor:
  min_time_to_show: minimum time to show the elapsed time when calling 'add' method
  show: print out results on screen

attr_reader:
  name: name given for the Timify instance
  initial_time: when the instance was created
  total: total time elapsed
  max_time_spent: maximum time measured for this instance

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, min_time_to_show: 0, show: true) ⇒ Timify

input:

name: name for the instance
min_time_to_show: minimum time to show the elapsed time when calling 'add' method
show: print out results on screen

examples:

t = Timify.new :create_user
t.show = false
$tim = Timify.new :dbprocess, show:false, min_time_to_show: 0.5


29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/timify.rb', line 29

def initialize(name, min_time_to_show: 0, show: true)
  @name=name
  @min_time_to_show=min_time_to_show
  @show=show
  @initial_time=Time.new
  @max_time_spent=0
  @timify_prev=@initial_time
  @location_prev=nil
  @timify={}
  @timify_by_label={}
  @timify_by_range={}
  @count={}
  @total=0
  puts "<#{@name}> Timify init:<#{@initial_time}>. Location: #{caller[0].scan(/(.+):in\s/).join}"
end

Instance Attribute Details

#initial_timeObject (readonly)

Returns the value of attribute initial_time



16
17
18
# File 'lib/timify.rb', line 16

def initial_time
  @initial_time
end

#max_time_spentObject (readonly)

Returns the value of attribute max_time_spent



16
17
18
# File 'lib/timify.rb', line 16

def max_time_spent
  @max_time_spent
end

#min_time_to_showObject

Returns the value of attribute min_time_to_show



15
16
17
# File 'lib/timify.rb', line 15

def min_time_to_show
  @min_time_to_show
end

#nameObject (readonly)

Returns the value of attribute name



16
17
18
# File 'lib/timify.rb', line 16

def name
  @name
end

#showObject

Returns the value of attribute show



15
16
17
# File 'lib/timify.rb', line 15

def show
  @show
end

#totalObject (readonly)

Returns the value of attribute total



16
17
18
# File 'lib/timify.rb', line 16

def total
  @total
end

Instance Method Details

#add(*label) ⇒ Object

Adds a new point to count the time elapsed. It will count from the last 'add' call or Timify creation in case of the first 'add'.

input:
  label: (optional) In case supplied it will summarize all the ones with the same label

output: (float)
  time elapsed in seconds

examples:
  t=Timify.new :example
  t.add; run_sqls; t.add :database
  t.add
  #some processes
  t.add
  #some processes
  send_email_alert if t.add > 0.2
  #some processes
  do_log(t.totals[:message]) if t.add > 0.5


66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/timify.rb', line 66

def add(*label)
  if !label.empty?
    label=label[0]
  else
    label=""
  end

  time_now=Time.new
  time_spent=(time_now-@timify_prev).to_f
  @total=(time_now-@initial_time).to_f
  new_max=false
  location=caller[0].scan(/(.+):in\s/).join
  if time_spent > @max_time_spent then
    new_max = true
    @max_time_spent = time_spent
  end
  @timify[location]=@timify[location].to_f+time_spent
  @count[location]=@count[location].to_i+1
  if !label.empty?
    @timify_by_label[label]=@timify_by_label[label].to_f+time_spent
    @count[label]=@count[label].to_i+1
  end
  if !@location_prev.nil?
    @timify_by_range["#{@location_prev} - #{location}"]=@timify_by_range["#{@location_prev} - #{location}"].to_f + time_spent
    @count["#{@location_prev} - #{location}"]=@count["#{@location_prev} - #{location}"].to_i+1
  end


  if @total > 0
    percent=((@timify[location]/@total)*100).round(0)
  else
    percent=0
  end
  if time_spent>=@min_time_to_show
    if @show
      puts "<#{@name}>#{"<#{label}>" if !label.empty?}#{"(New Max)" if new_max}: #{location} (#{percent}%): #{@total.round(2)}; #{time_spent.round(2)}"
    end
  end
  @timify_prev=time_now
  @location_prev=location
  return time_spent
end

#totals(json: false) ⇒ Object

returns all data for this instance

input:
  json: (boolean) in case of true the output will be in json format instead of a hash

output: (Hash or json string)
  name: (String) name given for this instance
  total_time: (float) total elapsed time from initialization to last 'add' call
  started: (Time)
  finished: (Time)
  message: (String) a printable friendly message giving all information
  locations, labels, ranges: (Hash) the resultant hash contains:
    secs: (float) number of seconds
    percent: (integer) percentage in reference to the total time
    count: (integer) number of times
  locations: (Hash) All summary data by location where was called
  labels: (Hash) All summary data by label given on 'add' method
  ranges: (Hash) All summary data by ranges where was called, from last 'add' call to current 'add' call


130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
# File 'lib/timify.rb', line 130

def totals(json: false)
  require 'json' if json
  output={
      name: @name,
      total_time: @total.to_f,
      started: @initial_time,
      finished: @timify_prev,
      locations: {},
      labels: {},
      ranges: {}
  }
  message="\n\nTotal time <#{@name}>:#{@total.to_f.round(2)}"
  message+="\nTotal time by location:\n"
  @timify.each {|location, secs|
    if @total==0 then
      percent=0
    else
      percent=(secs*100/(@total).to_f).round(0)
    end
    message+= "\t#{location}: #{secs.round(2)} (#{percent}%) ##{@count[location]}"
    output[:locations][location]={
        secs: secs,
        percent: percent,
        count: @count[location]
    }
  }
  if !@timify_by_label.empty?
    message+= "\nTotal time by label:\n"
    @timify_by_label.each {|label, secs|
      if @total==0 then
        percent=0
      else
        percent=(secs*100/(@total).to_f).round(0)
      end
      message+= "\t#{label}: #{secs.round(2)} (#{percent}%) ##{@count[label]}"
      output[:labels][label]={
          secs: secs,
          percent: percent,
          count: @count[label]
      }
    }
  end

  if !@timify_by_range.empty?
    message+= "\nTotal time by range:\n"
    @timify_by_range.each {|range, secs|
      if @total==0 then
        percent=0
      else
        percent=(secs*100/(@total).to_f).round(0)
      end
      message+= "\t#{range}: #{secs.round(2)} (#{percent}%) ##{@count[range]}"
      output[:ranges][range]={
          secs: secs,
          percent: percent,
          count: @count[range]
      }
    }
  end

  message+= "\n\n"
  output[:message]=message
  puts message if @show
  output=output.to_json if json
  return output
end