![]() |
Adventures in Optimization.. When a Ruby primitive is the Hog.
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 :orig_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 :orig_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 : john.carter@tait.co.nz New Zealand |
| All times are GMT. The time now is 05:15 AM. |
Powered by vBulletin®. Copyright ©2000 - 2013, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.