这是代码:
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 :(得分:0)
我会说“每100毫秒迭代次数”;但我们要验证。
运行此代码:
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:
Benchmark / 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
换句话说,它首先通过运行@warmup
时间的块来“预热”各种磁盘缓存,CPU缓存等,并报告它运行的多次迭代。在我的例子中,因为我的代码是如此“缓慢”。然后报告在预热期间运行了多少cycles_per_100ms
,并且至少有1个周期。
你可以大多忽略热身数据,在你的例子中我们可以看到1069 i / 100ms和507 i / 100ms预热数与10581.7 i / s和5089 i / s结果大致相同。在某些情况下它可能很有用,并且差异很大可能表明某些缓存可以显着提高性能。