Adventures in Optimization.. When a Ruby primitive is the Hog.

Discussion in 'Ruby' started by John Carter, Dec 2, 2008.

  1. John Carter

    John Carter Guest

    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 :eek: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 :eek: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 :
    New Zealand
    John Carter, Dec 2, 2008
    #1
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    7
    Views:
    599
    Victor Bazarov
    May 9, 2005
  2. Daisy
    Replies:
    3
    Views:
    346
  3. Daniel Pitts
    Replies:
    7
    Views:
    470
  4. John Carter
    Replies:
    4
    Views:
    118
    F. Senault
    Dec 2, 2008
  5. John Carter
    Replies:
    0
    Views:
    104
    John Carter
    Dec 2, 2008
Loading...

Share This Page