2011-12-05 4 views
1

내 코드를 프로파일 링 할 ruby-prof 보석을 사용하고 결과.루비 프로파일 러는 해석

그리고 결과는 다음과 같습니다

%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? 
... 

내 코드는하지 않습니다 확신은 Hash ES의 일부에 존재하지 않는 키에 액세스하려고합니다. 질문은 무엇입니까? Hash#default의 의미일까요?

그리고 여기의 코드 조각입니다 :

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 > selections.size || new_portion < 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 << (@q_hash[qid] - grouped_wrong[qid])[0] 
     end 
     end 
    end 
    process(level + 1, local_right, local_wrong) 
    end 

    def start 
    process(0, [], []) 
    end 
end 

@selections, @portions이 Array의이다; @q_hash, @siblings, @limits 및 @vars는 Hash입니다. 하충 민의에

+1

충분히 소스/O를 동작을 재현 w를 말할 수 있습니다. –

+0

당신은 루비만을 사용하고 있습니까? 아니면 실제로 레일을 사용하고 있습니까? –

+0

Taryn East, 이것은 레일 코드가 아닙니다. – taro

답변

0

감사합니다, 발견 대답은 :

하드
require 'ruby-prof' 
h = (0..9).inject({}) {|h, x| h[x] = (x+97).chr;h } 
a = (0..1000000).collect { rand(100) } 
RubyProf.start 
g = a.group_by {|x| h[x/10] } 
RubyProf::FlatPrinter.new(RubyProf.stop).print(STDOUT) 


Thread ID: 17188993880 
Total: 1.210938 

%self  total  self  wait child calls name 
100.00  1.21  1.21  0.00  0.00  1 Array#each 
    0.00  0.00  0.00  0.00  0.00  10 Hash#default 
    0.00  1.21  0.00  0.00  1.21  1 Enumerable#group_by 
    0.00  1.21  0.00  0.00  1.21  1 Object#irb_binding 
관련 문제