2015-01-30 2 views
-1

다음 루비 튜토리얼 https://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/50-debugging/lessons/124-benchmarking_ruby_code을하고 있습니다. 하는 블록에 소요를 실행하고, 그것이 걸린 시간을 반환하는 방법을 만들벤치마킹 루비 코드

사용 루비의 슈퍼 멋진 블록 : 운동 중 하나는 저를 묻는다.

운동은 다음과 같습니다

  1. 루비 블록 - Introduction to Blocks in Ruby (Ruby Primer)
:

def benchmark 
    # your code here! 
end 

time_taken = benchmark do 
    sleep 0.1 
end 
puts "Time taken #{time_taken}" 

이 운동은 아래 힌트 (힌트가 필요하십니까?)가

와 나는 그렇게했다 :

def benchmark(time) 
    begin_time = Time.now 
    end_time = Time.now 
    time.benchmark {|time| yield time} 
end 

time_taken = benchmark do 
    sleep 0.1 
end 
puts "Time taken #{time_taken} 

그러나 받았던다.

관심 대상 : 'do'다음에 요소를 나타내지 않고 지역 변수 - 'time_taken'이 왜 제안됩니까? 아니면 필요하지 않은가? 누구든지 코드를 작성하여 긍정적 인 결과를 얻을 수있는 방법을 알려줄 수 있습니까?

답변

2

당신은 훨씬 쉽게 수행해야합니다

def benchmark 
    begin_time = Time.now 
    yield 
    end_time = Time.now 
    end_time - begin_time 
end 

time_taken = benchmark do 
    sleep 0.1 
end 

puts "Time taken #{time_taken}" 

먼저 당신이 시간을 수집하고 yield, 변수 begin_time에서의 저장 - 후 종료 시간을 수집, 그래서 블록을 실행합니다. 차이점을 반환하십시오. 그게 전부 야.

3

꽤 멀리 떨어져 있고 실제로는 살 수는 없습니다. 온 그 어디 확실하지 않다, 더 time.benchmark 방법이 없다, 지금까지 전달되는 블록을 실행으로

def benchmark 
    let begin_time -> current time 
    execute the block 
    let end_time -> current_time 
    return endtime - begintime 
end 

을, 당신은 할 수 :

벤치 마크 방법이 의사 코드처럼 보이게한다 블록에 아무것도 전달할 필요가 없습니다. 단일, 단순한 yield을 원합니다.