【问题标题】:having issues with finding the average run time of a block在查找块的平均运行时间时遇到问题
【发布时间】:2013-08-30 18:28:23
【问题描述】:

我目前正在执行 Test First 编程并且卡在位于 http://testfirst.org/live/learn_ruby/performance_monitor 的 06_performance 监视器问题上,我在 stackoverflow 上找到了一个类似的线程,但我仍然不明白这个问题。在查找多个块的平均运行时间方面,我没有通过最后两个测试。到目前为止我的代码是:

def measure(i=1)
  if i>1
    i.times do 
      yield
    end
  else
    x = Time.now
    yield
    elapsed_time = Time.now - x
  end
end

我对测试试图做什么感到非常困惑。到目前为止,这是我认为我必须做的:

我认为任务是找出某些块需要多长时间才能运行。 但是,我不确定为什么这段代码甚至可以用于前几个测试。而且我在确切知道 yield 语句返回的内容方面遇到了问题。如果有人能指导我完成解决此问题的过程以便我理解解决方案,我将不胜感激。

【问题讨论】:

    标签: ruby rspec performance test-first


    【解决方案1】:

    到目前为止,您的方法基本没问题,只是您不需要从 i > 1 分支出 i == 1 - { 1.times { yield } 在功能上等同于仅调用 yield

    yield 不会自行返回任何内容。它是一个关键字,表示应该调用给定方法的块,并且可以选择提供变量,然后将这些变量传递给块,例如:

    class String
      def each_character_in_reverse_order
        each_char.to_a.reverse_each do |char|
          yield char
        end
      end
    end
    
    "hello".each_character_in_reverse_order do |c|
      puts c.upcase
    end
    
    #=> 
    # O
    # L
    # L
    # E
    # H
    

    对于您链接到的测试,块的返回值完全无关紧要,因为它们只关心运行块需要多长时间。但正如您在上面的示例中看到的,yield 关键字可以嵌入到它自己的块中 (reverse_each do ... end),这意味着您可以在每次调用给定块时将其他行为包装在它周围:

    1.times do
      start_time = Time.now
      yield
      elapsed = Time.now - start_time
    end
    

    在这种情况下,您想要times do ... end 块返回值,以便您可以平均给定块的运行时间,因此您需要找到一种方法将这些值存储在数组中,将它们平均在一起,并将该平均值作为 measure 方法的结果返回。请记住,您可以对单个值进行平均以返回该值,因此单次运行与多次运行不需要不同的行为。提示 - 您可以调用 n.times.map do ... end 直接从 times 块返回一个数组,而无需显式实例化一个。

    【讨论】:

    • 在数组中存储运行时间的解释确实让我了解了解决方案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-08-07
    • 2018-10-15
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多