title: Ruby profiler results interpretation
body: <p>I'm using a <code>ruby-prof</code> gem to profile my code.</p>
  
  <p>And results looks like this:</p>
  
  <pre><code> %self     total     self     wait    child    calls  name
   50.56     31.06    23.45     0.00     7.62   234593  Array#each
   14.29      6.62     6.62     0.00     0.00   562480  Array#-
   13.63      6.32     6.32     0.00     0.00   157816  Array#|
   11.20      5.20     5.20     0.00     0.00  6210903  Hash#default
    2.44     46.36     1.13     0.00    46.36    78909  Analyzer#process
    2.02     46.36     0.94     0.00    46.36    78908  Analyzer#try
    1.70      0.79     0.79     0.00     0.00   562481  UnboundMethod#bind
    1.53      7.34     0.71     0.00     6.62   562480  Method#call
    1.18      0.55     0.55     0.00     0.00   562480  Kernel#instance_variable_defined?
    0.76     46.36     0.35     0.00    46.36     6250  Array#combination
    0.37      0.17     0.17     0.00     0.00   105763  Array#concat
    0.25     25.19     0.12     0.00    25.07    77842  Enumerable#group_by
    0.02     46.36     0.01     0.00    46.36     3125  Enumerator#each
    0.02      0.01     0.01     0.00     0.00    78908  Array#empty?
  ...
  </code></pre>
  
  <p>I'm sure that my code does not tries to access non-existing keys in some of the <code>Hash</code>es.
  The question is - what <code>Hash#default</code> might mean?</p>
  
  <p>And here is a piece of code:</p>
  
  <pre><code>class Analyzer
  
    def process(level, hypo_right, hypo_wrong)
      if portion = @portions[level]
        selections = @selections[level] - hypo_wrong
        master_size = selections.size
        selections -= hypo_right
        new_portion = portion + selections.size - master_size
        if new_portion &gt; selections.size || new_portion &lt; 0
          return
        elsif new_portion == 0
          try(level, hypo_right, [], hypo_wrong, selections)
        else
          selections.combination(new_portion).each do |hypo_right2|
            try(level, hypo_right, hypo_right2, hypo_wrong, (selections - hypo_right2))
          end
        end
      else
        puts hypo_right.inspect
      end
    end
  
    def try(level, right, right2, wrong, wrong2)
      local_right = right | right2
      local_wrong = wrong | wrong2
      right2.each { |r| local_wrong.concat(@siblings[r]) }
  
      unless wrong2.empty?
        grouped_wrong = local_wrong.group_by{|e| @vars[e] }
        wrong2.each do |w|
          qid = @vars[w]
          if grouped_wrong[qid].size == @limits[qid]
            local_right &lt;&lt; (@q_hash[qid] - grouped_wrong[qid])[0]
          end
        end
      end
      process(level + 1, local_right, local_wrong)
    end
  
    def start
      process(0, [], [])
    end
  end
  </code></pre>
  
  <p>@selections, @portions are <code>Array</code>s; @q_hash, @siblings, @limits and @vars are <code>Hash</code>es.</p>