我正在做以下Ruby教程 https://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/50-debugging/lessons/124-benchmarking_ruby_code。其中一个练习要求我:
使用 Ruby 的超级棒块来创建一种方法,该方法需要 块,执行它,并返回它所花费的时间。
练习如下所示:
def benchmark
# your code here!
end
time_taken = benchmark do
sleep 0.1
end
puts "Time taken #{time_taken}"
练习下面有一个提示(需要提示吗?
- Ruby Blocks - Ruby 中的 Blocks 简介 (Ruby Primer)
我这样做了:
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}
但收到错误。
我感兴趣的是:为什么局部变量 - "time_taken"建议不表示"do"之后的元素? 还是没有必要?谁能告诉我如何编写代码以获得积极的结果。
你应该更容易做到:
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}"
首先收集时间并存储在变量begin_time
中,然后yield
- 所以运行块,然后收集结束时间。返回差额。就是这样。
这很遥远,而且根本不是可以挽救的。
您的基准测试方法应类似于以下伪代码:
def benchmark
let begin_time -> current time
execute the block
let end_time -> current_time
return endtime - begintime
end
至于执行传入的块,没有time.benchmark
方法,我不确定它来自哪里,你不需要将任何东西传递到块中。你想要一个单一的、简单的yield
。