0

Test-First-Teaching performance_monitorを構築していて、5番目のテストに到達できますが、失敗します。

ブロックが1回だけ実行されるのはなぜですか?

これは私のコードです:

require "time"
t = Time.now
def measure x=0
start = Time.now
    yield x 
endt = Time.now - start
    end
measure(4){ |x| x.times do Time.now - t end}

これはエラーです:

*Error____
Performance Monitor
  takes about 0 seconds to run an empty block
  takes exactly 0 seconds to run an empty block (with stubs)
  takes about 1 second to run a block that sleeps for 1 second
  takes exactly 1 second to run a block that sleeps for 1 second (with stubs)
  runs a block N times (FAILED - 1)

Failures:

  1) Performance Monitor runs a block N times
     Failure/Error: n.should == 4
       expected: 4
            got: 1 (using ==)
4

2 に答える 2

1

次のように考えてください。measureメソッドは、渡されるブロックが正しい回数実行されることを確認するためのメソッドです。したがって、渡すブロックには、 1回の反復measureで実行する必要があるコードのみを含める必要があります。

必要最低限​​の例(ゲイリー・バーンハートの「WAT」トークから恥知らずにリッピングされたテーマ):

def repeat_x_times(x)
    # This runs the passed block x times:
    x.times do
        yield
    end
end

repeat_x_times(16) do
    # This is what should happen in a single iteration:
    puts 0.0 / 0.0
end

puts 'Batman!'

ブロックのもう1つの優れた点は、yieldが発生する場所に関係なく、ブロックと同じスコープ内の変数(通常はローカル変数)にいつでもアクセスできることです。

i = 3
4.times {i += 1} # We can still get to i!
puts i           # Prints "7"

2つの概念を組み合わせて、もう少し複雑な例を示します。

array = [3, 6, 9, 12, 15]
sum = 0
array.each do |item|
    # In the first iteration, item is 3; in the second it's 6, and so on:
    sum += item
end
puts sum

さて、私はあなたの質問に直接答えていないことを知っていますが、あなたはRubyを学んでいるようですので、これがカットアンドペーストよりも役立つことを願っています...とにかく、あなたがそれを得るまでこれを試してみてください、そしてすぐに、すべての言語にこのような便利な機能が備わっていることを願うでしょう!

于 2013-01-24T14:42:21.357 に答える
0

私が思いついたもの:

    require "time"

    def measure (x=1)
        elapsed = 0
        x.times do
        start = Time.now
        yield
        endt = Time.now
        elapsed += endt - start
   end
   elapsed / x
   if elapsed < 1 
        time = "milliseconds"
   else
        time = "seconds"

    end
    puts "We ran this block #{x} times \nand it took #{elapsed} #{time}"
    end

    measure(50000){puts "Run a block" }
于 2013-01-25T02:42:20.087 に答える