J
John Carter
So you've run your code with -rprofile or require 'profile'
And the answer was IO.each_line
Which is a bit like saying the answer to the Question of Life, the
Universe and Everything is "42".
a) You've used IO.each_line in many places.
b) There is nothing you can do to speed it up.
Enter Carter's Canny Primitive Profiler..
$f=Hash.new(0)
CUNNING_MIN_CARE = 1 # Only care about stack frames that have been called
# at least CUNNING_MIN_CARE times
CUNNING_DEPTH = 2 # Profile base on CUNNING_DEPTH number of
# stack frames of this calls that that calls... that
# calls Array.each
# Make it -1 if you want the lot.
at_exit{
$f.keys.find_all{|k| $f[k] >= CUNNING_MIN_CARE}.sort_by{|k| $f[k]}.each{|k|
puts "\n\n#{k} >>>#{$f[k]}<<<"
}
}
class IO
alias_method rig_each_line, :each_line
def each_line(&block)
i=0
orig_each_line do |l|
block.call(l)
i+= 1
end
ensure
$f[caller(1)[0..CUNNING_DEPTH].join("\n")] += i
end
end
On exit you can _see_ which invocation of each_line via which path was
the busiest!
Of course, sometimes we don't actually care about CPU time. The by
several orders of magnitude, the slowest operation in a modern PC is
pulling stuff of the disk.
So how about this variation on the Theme...
class IO
alias_method rig_read, :read
def read(*arg)
start = Time.now
orig_read(*arg)
ensure
$f[caller(1)[0..CUNNING_DEPTH].join("\n")] += Time.now - start
end
end
I love Ruby
John Carter Phone : (64)(3) 358 6639
Tait Electronics Fax : (64)(3) 359 4632
PO Box 1645 Christchurch Email : (e-mail address removed)
New Zealand
And the answer was IO.each_line
Which is a bit like saying the answer to the Question of Life, the
Universe and Everything is "42".
a) You've used IO.each_line in many places.
b) There is nothing you can do to speed it up.
Enter Carter's Canny Primitive Profiler..
$f=Hash.new(0)
CUNNING_MIN_CARE = 1 # Only care about stack frames that have been called
# at least CUNNING_MIN_CARE times
CUNNING_DEPTH = 2 # Profile base on CUNNING_DEPTH number of
# stack frames of this calls that that calls... that
# calls Array.each
# Make it -1 if you want the lot.
at_exit{
$f.keys.find_all{|k| $f[k] >= CUNNING_MIN_CARE}.sort_by{|k| $f[k]}.each{|k|
puts "\n\n#{k} >>>#{$f[k]}<<<"
}
}
class IO
alias_method rig_each_line, :each_line
def each_line(&block)
i=0
orig_each_line do |l|
block.call(l)
i+= 1
end
ensure
$f[caller(1)[0..CUNNING_DEPTH].join("\n")] += i
end
end
On exit you can _see_ which invocation of each_line via which path was
the busiest!
Of course, sometimes we don't actually care about CPU time. The by
several orders of magnitude, the slowest operation in a modern PC is
pulling stuff of the disk.
So how about this variation on the Theme...
class IO
alias_method rig_read, :read
def read(*arg)
start = Time.now
orig_read(*arg)
ensure
$f[caller(1)[0..CUNNING_DEPTH].join("\n")] += Time.now - start
end
end
I love Ruby
John Carter Phone : (64)(3) 358 6639
Tait Electronics Fax : (64)(3) 359 4632
PO Box 1645 Christchurch Email : (e-mail address removed)
New Zealand