Ruby基准测试代码。我看到了什么?

Ruby基准测试代码。我看到了什么?,ruby,Ruby,代码如下: require 'active_support/json' require 'benchmark/ips' require 'dalli' client = Dalli::Client.new('localhost', namespace: 'json-bm', compress: true) object = { id: 1000, published: false, posts: [ { id: 2000, body: 'Lorem ipsum dolor

代码如下:

require 'active_support/json'
require 'benchmark/ips'
require 'dalli'

client = Dalli::Client.new('localhost', namespace: 'json-bm', compress: true)

object = {
  id: 1000,
  published: false,
  posts: [
    { id: 2000, body: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur. Donec ut libero sed arcu vehicula ultricies a non tortor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor. Pellentesque auctor nisi id magna consequat sagittis. Curabitur dapibus enim sit amet elit pharetra tincidunt feugiat nisl imperdiet. Ut convallis libero in urna ultrices accumsan. Donec sed odio eros. Donec viverra mi quis quam pulvinar at malesuada arcu rhoncus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In rutrum accumsan ultricies. Mauris vitae nisi at sem facilisis semper ac in est.' }
  ]
}

client.set("object-to-json", object.to_json)
client.set("object-as-json", object.as_json)

GC.disable

Benchmark.ips do |x|
  x.report('to_json') { client.get('object-to-json') }
  x.report('as_json') { client.get('object-as-json').to_json }
end
毫不奇怪,存储和检索字符串比 检索封送的对象并在每次发送时对其进行字符串化 找回了

那么1069和507是代码运行的次数吗?i/100ms是什么意思?

我会说“每100ms迭代次数”;但让我们核实一下

运行此代码:

require 'benchmark/ips'

Benchmark.ips do |x|
  x.report('to_json') { sleep 1 }
  x.report('as_json') { sleep 2 }
end
我得到:

Warming up --------------------------------------
             to_json     1.000  i/100ms
             as_json     1.000  i/100ms
Calculating -------------------------------------
             to_json      1.000  (± 0.0%) i/s -      5.000 
             as_json      0.500  (± 0.0%) i/s -      3.000  in   6.000514s
这与您所拥有的略有不同− 可能是因为不同版本的宝石

“计算”块的输出为:

Benchmark/ips将报告给定代码块每秒的迭代次数。在分析结果时,请注意标准偏差的百分比,它告诉我们测量值与平均值的分布情况。高标准偏差可能表明结果具有太多的可变性

因此,这里我的
to_json
每秒运行一次,结果之间没有偏差;my
as_json
每秒运行0.5次,结果也没有偏差

不幸的是,给出了一个503,但是我找到了从该方法调用的方法;两个函数的缩写如下:

def warmup_stats(_warmup_time_us, timing)
  $stdout.printf "%s i/100ms\n", Helpers.scale(timing)
end

def run_warmup
  before = Time.now
  target = Time.now + @warmup

  warmup_iter = 0

  while Time.now < target
    item.call_times(1)
    warmup_iter += 1
  end

  after = Time.now

  warmup_time_us = time_us before, after
  @timing[item] = cycles_per_100ms warmup_time_us, warmup_iter
  @stdout.warmup_stats warmup_time_us, @timing[item]
end
def预热统计数据(预热时间,计时)
$stdout.printf“%s i/100ms\n”,Helpers.scale(计时)
结束
def运行预热
以前=时间。现在
target=Time.now+@warmup
预热温度=0
而Time.now
换句话说,它首先通过在
@warmup
时间内运行块来“预热”各种磁盘缓存、CPU缓存等,并报告所运行的多次迭代。在我的示例中,只有一次,因为我的代码太“慢”。然后报告在预热过程中每100ms运行多少个
循环,最少运行一个循环

您可以忽略预热数据,在您的示例中,我们可以看到1069 i/100ms和507 i/100ms预热数据与10581.7 i/s和5089 i/s结果大致相同。不过,在某些情况下,它可能很有用,而且一个很大的差异可能表明通过一些缓存可以显著提高性能

def warmup_stats(_warmup_time_us, timing)
  $stdout.printf "%s i/100ms\n", Helpers.scale(timing)
end

def run_warmup
  before = Time.now
  target = Time.now + @warmup

  warmup_iter = 0

  while Time.now < target
    item.call_times(1)
    warmup_iter += 1
  end

  after = Time.now

  warmup_time_us = time_us before, after
  @timing[item] = cycles_per_100ms warmup_time_us, warmup_iter
  @stdout.warmup_stats warmup_time_us, @timing[item]
end