socialforge/lib/dalli-2.7.2/test/benchmark_test.rb

243 lines
6.9 KiB
Ruby

require 'helper'
require 'benchmark'
require 'active_support/cache/dalli_store'
describe 'performance' do
before do
puts "Testing #{Dalli::VERSION} with #{RUBY_DESCRIPTION}"
# We'll use a simple @value to try to avoid spending time in Marshal,
# which is a constant penalty that both clients have to pay
@value = []
@marshalled = Marshal.dump(@value)
@servers = ['127.0.0.1:19122', 'localhost:19122']
@key1 = "Short"
@key2 = "Sym1-2-3::45"*8
@key3 = "Long"*40
@key4 = "Medium"*8
# 5 and 6 are only used for multiget miss test
@key5 = "Medium2"*8
@key6 = "Long3"*40
@counter = 'counter'
end
it 'runs benchmarks' do
memcached do
Benchmark.bm(37) do |x|
n = 2500
@ds = ActiveSupport::Cache::DalliStore.new(@servers)
x.report("mixed:rails:dalli") do
n.times do
@ds.read @key1
@ds.write @key2, @value
@ds.fetch(@key3) { @value }
@ds.fetch(@key2) { @value }
@ds.fetch(@key1) { @value }
@ds.write @key2, @value, :unless_exists => true
@ds.delete @key2
@ds.increment @counter, 1, :initial => 100
@ds.increment @counter, 1, :expires_in => 12
@ds.decrement @counter, 1
end
end
x.report("mixed:rails-localcache:dalli") do
n.times do
@ds.with_local_cache do
@ds.read @key1
@ds.write @key2, @value
@ds.fetch(@key3) { @value }
@ds.fetch(@key2) { @value }
@ds.fetch(@key1) { @value }
@ds.write @key2, @value, :unless_exists => true
@ds.delete @key2
@ds.increment @counter, 1, :initial => 100
@ds.increment @counter, 1, :expires_in => 12
@ds.decrement @counter, 1
end
end
end
@ds.clear
sizeable_data = "<marquee>some view partial data</marquee>" * 50
[@key1, @key2, @key3, @key4, @key5, @key6].each do |key|
@ds.write(key, sizeable_data)
end
x.report("read_multi_big:rails:dalli") do
n.times do
@ds.read_multi @key1, @key2, @key3, @key4
@ds.read @key1
@ds.read @key2
@ds.read @key3
@ds.read @key4
@ds.read @key1
@ds.read @key2
@ds.read @key3
@ds.read_multi @key1, @key2, @key3
end
end
x.report("read_multi_big:rails-localcache:dalli") do
n.times do
@ds.with_local_cache do
@ds.read_multi @key1, @key2, @key3, @key4
@ds.read @key1
@ds.read @key2
@ds.read @key3
@ds.read @key4
end
@ds.with_local_cache do
@ds.read @key1
@ds.read @key2
@ds.read @key3
@ds.read_multi @key1, @key2, @key3
end
end
end
@m = Dalli::Client.new(@servers)
x.report("set:plain:dalli") do
n.times do
@m.set @key1, @marshalled, 0, :raw => true
@m.set @key2, @marshalled, 0, :raw => true
@m.set @key3, @marshalled, 0, :raw => true
@m.set @key1, @marshalled, 0, :raw => true
@m.set @key2, @marshalled, 0, :raw => true
@m.set @key3, @marshalled, 0, :raw => true
end
end
@m = Dalli::Client.new(@servers)
x.report("setq:plain:dalli") do
@m.multi do
n.times do
@m.set @key1, @marshalled, 0, :raw => true
@m.set @key2, @marshalled, 0, :raw => true
@m.set @key3, @marshalled, 0, :raw => true
@m.set @key1, @marshalled, 0, :raw => true
@m.set @key2, @marshalled, 0, :raw => true
@m.set @key3, @marshalled, 0, :raw => true
end
end
end
@m = Dalli::Client.new(@servers)
x.report("set:ruby:dalli") do
n.times do
@m.set @key1, @value
@m.set @key2, @value
@m.set @key3, @value
@m.set @key1, @value
@m.set @key2, @value
@m.set @key3, @value
end
end
@m = Dalli::Client.new(@servers)
x.report("get:plain:dalli") do
n.times do
@m.get @key1, :raw => true
@m.get @key2, :raw => true
@m.get @key3, :raw => true
@m.get @key1, :raw => true
@m.get @key2, :raw => true
@m.get @key3, :raw => true
end
end
@m = Dalli::Client.new(@servers)
x.report("get:ruby:dalli") do
n.times do
@m.get @key1
@m.get @key2
@m.get @key3
@m.get @key1
@m.get @key2
@m.get @key3
end
end
@m = Dalli::Client.new(@servers)
x.report("multiget:ruby:dalli") do
n.times do
# We don't use the keys array because splat is slow
@m.get_multi @key1, @key2, @key3, @key4, @key5, @key6
end
end
@m = Dalli::Client.new(@servers)
x.report("missing:ruby:dalli") do
n.times do
begin @m.delete @key1; rescue; end
begin @m.get @key1; rescue; end
begin @m.delete @key2; rescue; end
begin @m.get @key2; rescue; end
begin @m.delete @key3; rescue; end
begin @m.get @key3; rescue; end
end
end
@m = Dalli::Client.new(@servers)
x.report("mixed:ruby:dalli") do
n.times do
@m.set @key1, @value
@m.set @key2, @value
@m.set @key3, @value
@m.get @key1
@m.get @key2
@m.get @key3
@m.set @key1, @value
@m.get @key1
@m.set @key2, @value
@m.get @key2
@m.set @key3, @value
@m.get @key3
end
end
@m = Dalli::Client.new(@servers)
x.report("mixedq:ruby:dalli") do
@m.multi do
n.times do
@m.set @key1, @value
@m.set @key2, @value
@m.set @key3, @value
@m.get @key1
@m.get @key2
@m.get @key3
@m.set @key1, @value
@m.get @key1
@m.set @key2, @value
@m.replace @key2, @value
@m.delete @key3
@m.add @key3, @value
@m.get @key2
@m.set @key3, @value
@m.get @key3
end
end
end
@m = Dalli::Client.new(@servers)
x.report("incr:ruby:dalli") do
counter = 'foocount'
n.times do
@m.incr counter, 1, 0, 1
end
n.times do
@m.decr counter, 1
end
assert_equal 0, @m.incr(counter, 0)
end
end
end
end
end