对 Ruby 代码进行基准测试



我正在做以下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}"

练习下面有一个提示(需要提示吗?

  1. 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

最新更新