2016-03-15 55 views
0

这是代码:红宝石基准代码。我在看什么?

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 
Calculating ------------------------------------- 
      to_json  1069 i/100ms 
      as_json  507 i/100ms 
------------------------------------------------- 
      to_json 10581.7 (±12.0%) i/s -  50243 in 5.039299s 
      as_json  5089.4 (±0.9%) i/s -  25857 in 5.080955s 

存储和检索字符串是,勿庸置疑,2.1倍的速度比 检索编组对象和每一个是检索 时间字符串化它。

那么数字1069和507代码的运行次数是多少?我/ 100ms是什么意思?

回答

0

我会说“每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 

这与你有什么略有不同 - 可能是由于不同版本的宝石。

的“计算”块的输出是described on the homepage

基准/ IPS将报告每秒的迭代次数对于给定的代码块。在分析结果时,注意标准偏差的百分比,它告诉我们测量的平均值是多少。高标准偏差可能表明结果具有太多的可变性。

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

不幸的是,the documentation给出了503,但是通过searching the code我找到了warmup_stats()方法,它从run_warmup()方法调用;缩写两种功能读:

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 

换句话说,它首先“预热”的各种磁盘高速缓存,CPU高速缓存,并通过运行块@warmup时间这样,对于许多迭代它跑报告。在我的例子中,只有一次,因为我的代码太“慢”。然后报告在预热期间运行多少个cycles_per_100ms,最少1个周期。

在你的例子中,我们可以看到1069个I/100ms和507个I/100ms热身数与10581.7个I/S和5089个I/S的结果大致相同,你大都可以忽略这个热身数。但是,在某些情况下,它可能会有用,而且很大的差异可能表明某些缓存可以显着提高性能。