【问题标题】:Benchmarking a ruby operation that returns a value对返回值的 ruby​​ 操作进行基准测试
【发布时间】:2012-01-02 06:28:39
【问题描述】:

基准测试需要一个块并返回时间: http://ruby-doc.org/stdlib-1.9.3/libdoc/benchmark/rdoc/Benchmark.html

require 'benchmark'
puts Benchmark.measure { "a"*1_000_000 }

如果您想对操作进行基准测试并同时获取返回值和经过的时间怎么办?

或者,换一种说法,闭包可以修改传递给它的对象吗?

【问题讨论】:

    标签: ruby closures benchmarking


    【解决方案1】:

    闭包可以修改其范围内的对象,如下所示:

    require 'benchmark'
    
    a = nil
    puts Benchmark.measure { a = "a" * 1_000_000 }
    puts a.size
    
    # =>   0.000000   0.000000   0.000000 (  0.004865)
    # => 1000000
    

    【讨论】:

    • 所以闭包有一个可写指针指向传递给它们的内容?并且闭包也可以修改@a 和@@a,假设它们是在闭包之外定义的。
    • @justingordon:是的,他们可以。
    • 呸。我真的希望 Benchmark 能返回类似:[time, result]。然后你可以:time, a = Benchmark.measure { ... }
    【解决方案2】:

    https://github.com/igorkasyanchuk/benchmark_methods

    不再有这样的代码:

    t = Time.now
    user.calculate_report
    puts Time.now - t
    

    现在你可以这样做了:

    benchmark :calculate_report # in class
    

    然后调用你的方法

    user.calculate_report
    

    【讨论】:

      猜你喜欢
      • 2017-09-18
      • 1970-01-01
      • 2016-12-24
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-30
      相关资源
      最近更新 更多