cache 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,96 @@
1
+ # sabshere 2/22/11 v0.0.2
2
+
3
+ Darwin vidalia 9.8.0 Darwin Kernel Version 9.8.0: Wed Jul 15 16:55:01 PDT 2009; root:xnu-1228.15.4~1/RELEASE_I386 i386
4
+ ruby 1.8.7 (2010-05-25 patchlevel 266) [i686-darwin9.8.0]
5
+ RUBY_VERSION=ruby-1.8.7-head
6
+ Ruby 1.8.7p266
7
+ Loaded memcached 1.0.6
8
+ Loaded remix-stash 1.1.3
9
+ Loaded memcache-client 1.8.5
10
+ Loaded cache 0.0.2
11
+ Loaded kgio 2.3.2
12
+ Loaded dalli 1.0.2
13
+ Loops is 20000
14
+ Stack depth is 0
15
+ Small value size is: 13 bytes
16
+ Large value size is: 4158 bytes
17
+ No matching processes belonging to you were found
18
+ user system total real
19
+ set: cache:dalli:bin 6.340000 1.880000 8.220000 ( 10.948888)
20
+ set: cache:libm:bin 5.730000 1.530000 7.260000 ( 10.640067)
21
+ set: dalli:bin 5.580000 1.860000 7.440000 ( 10.092303)
22
+ set: libm:ascii 0.840000 1.290000 2.130000 ( 5.445700)
23
+ set: libm:ascii:pipeline 0.340000 0.020000 0.360000 ( 0.362669)
24
+ set: libm:ascii:udp 0.710000 0.710000 1.420000 ( 3.642532)
25
+ set: libm:bin 0.710000 1.320000 2.030000 ( 5.339189)
26
+ set: libm:bin:buffer 0.300000 0.110000 0.410000 ( 1.107518)
27
+ set: mclient:ascii 10.700000 3.670000 14.370000 ( 14.945212)
28
+ set: stash:bin 3.710000 1.370000 5.080000 ( 8.162312)
29
+
30
+ get: cache:dalli:bin 6.820000 2.080000 8.900000 ( 11.412364)
31
+ get: cache:libm:bin 5.670000 1.490000 7.160000 ( 10.392625)
32
+ get: dalli:bin 5.840000 2.090000 7.930000 ( 10.308551)
33
+ get: libm:ascii 0.970000 1.310000 2.280000 ( 5.562719)
34
+ get: libm:ascii:pipeline 1.060000 1.620000 2.680000 ( 5.881988)
35
+ get: libm:ascii:udp 0.820000 0.720000 1.540000 ( 3.585481)
36
+ get: libm:bin 0.810000 1.330000 2.140000 ( 5.310565)
37
+ get: libm:bin:buffer 0.940000 1.630000 2.570000 ( 5.677996)
38
+ get: mclient:ascii 12.680000 3.690000 16.370000 ( 16.930786)
39
+ get: stash:bin 3.390000 1.370000 4.760000 ( 7.658067)
40
+
41
+ delete: cache:dalli:bin 6.190000 2.080000 8.270000 ( 10.697357)
42
+ delete: cache:libm:bin 6.080000 1.580000 7.660000 ( 10.938304)
43
+ delete: dalli:bin 5.190000 2.080000 7.270000 ( 9.694417)
44
+ delete: libm:ascii 1.790000 1.400000 3.190000 ( 6.452993)
45
+ delete: libm:ascii:pipeline 0.550000 0.620000 1.170000 ( 1.226934)
46
+ delete: libm:ascii:udp 1.620000 0.870000 2.490000 ( 4.440414)
47
+ delete: libm:bin 1.720000 1.400000 3.120000 ( 6.322207)
48
+ delete: libm:bin:buffer 0.460000 0.520000 0.980000 ( 1.651911)
49
+ delete: mclient:ascii 10.610000 3.700000 14.310000 ( 14.815498)
50
+ delete:stash:bin => #<NoMethodError: undefined method `delete' for #<Remix::Stash:0x122e984>>
51
+
52
+ get-missing: cache:dalli:bin 6.300000 2.110000 8.410000 ( 10.962403)
53
+ get-missing: cache:libm:bin 7.090000 1.780000 8.870000 ( 12.435441)
54
+ get-missing: dalli:bin 5.730000 2.260000 7.990000 ( 10.758698)
55
+ get-missing: libm:ascii 2.070000 1.550000 3.620000 ( 7.211442)
56
+ get-missing: libm:ascii:pipeline 2.190000 1.920000 4.110000 ( 7.549889)
57
+ get-missing: libm:ascii:udp 1.820000 0.930000 2.750000 ( 4.887171)
58
+ get-missing: libm:bin 1.990000 1.510000 3.500000 ( 6.837518)
59
+ get-missing: libm:bin:buffer 2.050000 1.830000 3.880000 ( 7.134244)
60
+ get-missing: mclient:ascii 11.160000 3.790000 14.950000 ( 15.550381)
61
+ get-missing: stash:bin 3.240000 1.390000 4.630000 ( 7.602964)
62
+
63
+ set-large: cache:dalli:bin 8.160000 2.010000 10.170000 ( 13.146422)
64
+ set-large: cache:libm:bin 6.490000 1.610000 8.100000 ( 11.726796)
65
+ set-large: dalli:bin 7.490000 2.030000 9.520000 ( 12.402519)
66
+ set-large: libm:ascii 0.920000 1.400000 2.320000 ( 5.925636)
67
+ set-large: libm:ascii:pipeline 0.630000 0.450000 1.080000 ( 1.246708)
68
+ set-large: libm:ascii:udp 0.790000 0.820000 1.610000 ( 4.095793)
69
+ set-large: libm:bin 0.810000 1.440000 2.250000 ( 5.770076)
70
+ set-large: libm:bin:buffer 0.570000 0.640000 1.210000 ( 2.286722)
71
+ set-large: mclient:ascii 11.940000 3.910000 15.850000 ( 17.592266)
72
+ set-large: stash:bin 6.250000 1.510000 7.760000 ( 13.191809)
73
+
74
+ get-large: cache:dalli:bin 8.320000 2.460000 10.780000 ( 13.958967)
75
+ get-large: cache:libm:bin 10.740000 1.760000 12.500000 ( 16.610462)
76
+ get-large: dalli:bin 7.270000 2.460000 9.730000 ( 12.867557)
77
+ get-large: libm:ascii 1.590000 1.540000 3.130000 ( 7.126347)
78
+ get-large: libm:ascii:pipeline 1.700000 1.900000 3.600000 ( 7.440423)
79
+ get-large: libm:ascii:udp 1.420000 0.950000 2.370000 ( 4.683143)
80
+ get-large: libm:bin 1.440000 1.580000 3.020000 ( 6.955872)
81
+ get-large: libm:bin:buffer 1.550000 1.920000 3.470000 ( 7.199426)
82
+ get-large: mclient:ascii 15.460000 4.560000 20.020000 ( 20.855362)
83
+ get-large: stash:bin 3.610000 1.450000 5.060000 ( 8.103802)
84
+
85
+ hash:jenkins 0.660000 0.010000 0.670000 ( 0.660554)
86
+ hash:hsieh 0.310000 0.000000 0.310000 ( 0.323458)
87
+ hash:default 0.620000 0.000000 0.620000 ( 0.616587)
88
+ hash:fnv1_32 0.620000 0.000000 0.620000 ( 0.631255)
89
+ hash:fnv1_64 1.280000 0.010000 1.290000 ( 1.291580)
90
+ hash:none 0.320000 0.000000 0.320000 ( 0.324198)
91
+ hash:md5 1.030000 0.000000 1.030000 ( 1.046663)
92
+ hash:murmur 0.560000 0.010000 0.570000 ( 0.574408)
93
+ hash:fnv1a_32 0.660000 0.000000 0.660000 ( 0.670788)
94
+ hash:fnv1a_64 0.690000 0.000000 0.690000 ( 0.701477)
95
+ hash:crc 0.640000 0.010000 0.650000 ( 0.646991)
96
+ vidalia:~/github/memcached (master) $
@@ -10,60 +10,92 @@ class Cache
10
10
  end
11
11
 
12
12
  def get(k)
13
- if defined?(::Memcached) and bare_client.is_a?(::Memcached)
13
+ reset_if_forked_or_threaded
14
+ if memcached?
14
15
  begin; bare_client.get(k); rescue ::Memcached::NotFound; nil; end
15
- elsif defined?(::Redis) and bare_client.is_a?(::Redis)
16
+ elsif dalli? or memcached_rails? or mem_cache?
17
+ bare_client.get k
18
+ elsif redis?
16
19
  if cached_v = bare_client.get(k) and cached_v.is_a?(::String)
17
20
  ::Marshal.load cached_v
18
21
  end
19
- elsif bare_client.respond_to?(:get)
20
- bare_client.get k
21
- elsif bare_client.respond_to?(:read)
22
+ elsif active_support_store?
22
23
  bare_client.read k
23
24
  else
24
- raise "Don't know how to work with #{bare_client.inspect} because it doesn't define get"
25
+ raise "Don't know how to GET with #{bare_client.inspect}"
25
26
  end
26
27
  end
27
28
 
28
29
  def set(k, v, ttl)
29
30
  ttl ||= parent.config.default_ttl
30
- if defined?(::Redis) and bare_client.is_a?(::Redis)
31
+ reset_if_forked_or_threaded
32
+ if memcached? or dalli? or memcached_rails? or mem_cache?
33
+ bare_client.set k, v, ttl
34
+ elsif redis?
31
35
  if ttl == 0
32
36
  bare_client.set k, ::Marshal.dump(v)
33
37
  else
34
38
  bare_client.setex k, ttl, ::Marshal.dump(v)
35
39
  end
36
- elsif bare_client.respond_to?(:set)
37
- bare_client.set k, v, ttl
38
- elsif bare_client.respond_to?(:write)
40
+ elsif active_support_store?
39
41
  if ttl == 0
40
42
  bare_client.write k, v # never expire
41
43
  else
42
44
  bare_client.write k, v, :expires_in => ttl
43
45
  end
44
46
  else
45
- raise "Don't know how to work with #{bare_client.inspect} because it doesn't define set"
47
+ raise "Don't know how to SET with #{bare_client.inspect}"
46
48
  end
47
49
  end
48
50
 
49
51
  def delete(k)
50
- if defined?(::Memcached) and bare_client.is_a?(::Memcached)
52
+ reset_if_forked_or_threaded
53
+ if memcached?
51
54
  begin; bare_client.delete(k); rescue ::Memcached::NotFound; nil; end
52
- elsif defined?(::Redis) and bare_client.is_a?(::Redis)
55
+ elsif redis?
53
56
  bare_client.del k
54
- elsif bare_client.respond_to?(:delete)
57
+ elsif dalli? or memcached_rails? or mem_cache? or active_support_store?
55
58
  bare_client.delete k
56
59
  else
57
- raise "Don't know how to work with #{bare_client.inspect} because it doesn't define delete"
60
+ raise "Don't know how to DELETE with #{bare_client.inspect}"
58
61
  end
59
62
  end
60
63
 
61
64
  def flush
65
+ reset_if_forked_or_threaded
62
66
  bare_client.send %w{ flush flushdb flush_all clear }.detect { |flush_cmd| bare_client.respond_to? flush_cmd }
63
67
  end
64
68
 
65
69
  private
66
70
 
71
+ def bare_client
72
+ @bare_client ||= parent.config.client
73
+ end
74
+
75
+ def reset_if_forked_or_threaded
76
+ if fork_detected?
77
+ if dalli?
78
+ parent.config.client.close
79
+ elsif dalli_store?
80
+ parent.config.client.reset
81
+ elsif memcached? or memcached_rails?
82
+ cloned_client = parent.config.client.clone
83
+ parent.config.client = cloned_client
84
+ @bare_client = parent.config.client
85
+ elsif redis?
86
+ parent.config.client.client.connect
87
+ elsif mem_cache?
88
+ parent.config.client.reset
89
+ end
90
+ elsif new_thread_detected?
91
+ if memcached? or memcached_rails?
92
+ cloned_client = parent.config.client.clone
93
+ parent.config.client = cloned_client
94
+ @bare_client = parent.config.client
95
+ end
96
+ end
97
+ end
98
+
67
99
  def fork_detected?
68
100
  if @pid != ::Process.pid
69
101
  @pid = ::Process.pid
@@ -75,24 +107,54 @@ class Cache
75
107
  @thread_object_id = ::Thread.current.object_id
76
108
  end
77
109
  end
110
+
111
+ def dalli?
112
+ return @dalli_query[0] if @dalli_query.is_a?(::Array)
113
+ answer = (defined?(::Dalli) and bare_client.is_a?(::Dalli::Client))
114
+ @dalli_query = [answer]
115
+ answer
116
+ end
78
117
 
79
- def bare_client
80
- fork_detected = fork_detected?
81
- new_thread_detected = new_thread_detected?
82
- if defined?(::Dalli) and parent.config.client.is_a?(::Dalli::Client)
83
- parent.config.client.close if fork_detected
84
- elsif defined?(::ActiveSupport::Cache::DalliStore) and parent.config.client.is_a?(::ActiveSupport::Cache::DalliStore)
85
- parent.config.client.reset if fork_detected
86
- elsif defined?(::Memcached) and (parent.config.client.is_a?(::Memcached) or parent.config.client.is_a?(::Memcached::Rails))
87
- parent.config.client = parent.config.client.clone if fork_detected or new_thread_detected
88
- elsif defined?(::Redis) and parent.config.client.is_a?(::Redis)
89
- parent.config.client.client.connect if fork_detected
90
- elsif defined?(::MemCache) and parent.config.client.is_a?(::MemCache)
91
- parent.config.client.reset if fork_detected
92
- else
93
- raise "Don't know how to thread/fork #{parent.config.client.inspect}"
94
- end
95
- parent.config.client
118
+ def active_support_store?
119
+ return @active_support_store_query[0] if @active_support_store_query.is_a?(::Array)
120
+ answer = (defined?(::ActiveSupport::Cache) and bare_client.is_a?(::ActiveSupport::Cache::Store))
121
+ @active_support_store_query = [answer]
122
+ answer
123
+ end
124
+
125
+ def dalli_store?
126
+ return @dalli_store_query[0] if @dalli_store_query.is_a?(::Array)
127
+ answer = (defined?(::ActiveSupport::Cache::DalliStore) and bare_client.is_a?(::ActiveSupport::Cache::DalliStore))
128
+ @dalli_store_query = [answer]
129
+ answer
130
+ end
131
+
132
+ def mem_cache?
133
+ return @mem_cache_query[0] if @mem_cache_query.is_a?(::Array)
134
+ answer = (defined?(::MemCache) and bare_client.is_a?(::MemCache))
135
+ @mem_cache_query = [answer]
136
+ answer
137
+ end
138
+
139
+ def memcached?
140
+ return @memcached_query[0] if @memcached_query.is_a?(::Array)
141
+ answer = (defined?(::Memcached) and bare_client.is_a?(::Memcached))
142
+ @memcached_query = [answer]
143
+ answer
144
+ end
145
+
146
+ def memcached_rails?
147
+ return @memcached_rails_query[0] if @memcached_rails_query.is_a?(::Array)
148
+ answer = (defined?(::Memcached) and bare_client.is_a?(::Memcached::Rails))
149
+ @memcached_rails_query = [answer]
150
+ answer
151
+ end
152
+
153
+ def redis?
154
+ return @redis_query[0] if @redis_query.is_a?(::Array)
155
+ answer = (defined?(::Redis) and bare_client.is_a?(::Redis))
156
+ @redis_query = [answer]
157
+ answer
96
158
  end
97
159
  end
98
160
  end
@@ -1,3 +1,3 @@
1
1
  class Cache
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -2,7 +2,6 @@ require 'rubygems'
2
2
  require 'bundler'
3
3
  Bundler.setup
4
4
  require 'test/unit'
5
- # require 'ruby-debug'
6
5
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
7
6
  $LOAD_PATH.unshift(File.dirname(__FILE__))
8
7
  require 'cache'
@@ -11,7 +10,7 @@ require 'shared_tests'
11
10
 
12
11
  class Test::Unit::TestCase
13
12
  def setup
14
- @cache = Cache.new @client
13
+ @cache = Cache.new raw_client
15
14
  @cache.flush
16
15
  end
17
16
  end
@@ -0,0 +1,236 @@
1
+ # sabshere 2/22/11 thanks to memcached
2
+ HERE = File.dirname(__FILE__)
3
+ $LOAD_PATH << "#{HERE}/../../lib/"
4
+ UNIX_SOCKET_NAME = File.join(ENV['TMPDIR']||'/tmp','memcached')
5
+
6
+ require 'memcached'
7
+ require 'benchmark'
8
+ require 'rubygems'
9
+ require 'ruby-debug' if ENV['DEBUG']
10
+ begin; require 'memory'; rescue LoadError; end
11
+
12
+ puts `uname -a`
13
+ puts `ruby -v`
14
+ puts `env | egrep '^RUBY'`
15
+ puts "Ruby #{RUBY_VERSION}p#{RUBY_PATCHLEVEL}"
16
+
17
+ [ ["memcached", "memcached"],
18
+ ["remix-stash", "remix/stash"],
19
+ # ["astro-remcached", "remcached"], # Clobbers the "Memcached" constant
20
+ ["memcache-client", "memcache"],
21
+ ["cache", "cache"],
22
+ ["kgio", "kgio"],
23
+ ["dalli","dalli"]].each do |gem_name, requirement|
24
+ require requirement
25
+ gem gem_name
26
+ puts "Loaded #{gem_name} #{Gem.loaded_specs[gem_name].version.to_s rescue nil}"
27
+ end
28
+
29
+ class Remix::Stash
30
+ # Remix::Stash API doesn't let you set servers
31
+ @@clusters = {:default => Remix::Stash::Cluster.new(['127.0.0.1:43042', '127.0.0.1:43043'])}
32
+ end
33
+
34
+ class Dalli::ClientCompat < Dalli::Client
35
+ def set(*args)
36
+ super(*args[0..2])
37
+ end
38
+ def get(*args)
39
+ super(args.first)
40
+ end
41
+ def get_multi(*args)
42
+ super(args.first)
43
+ end
44
+ def append(*args)
45
+ super
46
+ rescue Dalli::DalliError
47
+ end
48
+ def prepend(*args)
49
+ super
50
+ rescue Dalli::DalliError
51
+ end
52
+ end
53
+
54
+ class Cache::Compat < Cache
55
+ def set(*args)
56
+ super(*args[0..2])
57
+ end
58
+ def get(*args)
59
+ super(args.first)
60
+ end
61
+ end
62
+
63
+ class Bench
64
+
65
+ def initialize(loops = nil, stack_depth = nil)
66
+ @loops = (loops || 20000).to_i
67
+ @stack_depth = (stack_depth || 0).to_i
68
+
69
+ puts "Loops is #{@loops}"
70
+ puts "Stack depth is #{@stack_depth}"
71
+
72
+ @m_value = Marshal.dump(
73
+ @small_value = ["testing"])
74
+ @m_large_value = Marshal.dump(
75
+ @large_value = [{"test" => "1", "test2" => "2", Object.new => "3", 4 => 4, "test5" => 2**65}] * 2048)
76
+
77
+ puts "Small value size is: #{@m_value.size} bytes"
78
+ puts "Large value size is: #{@m_large_value.size} bytes"
79
+
80
+ @keys = [
81
+ @k1 = "Short",
82
+ @k2 = "Sym1-2-3::45" * 8,
83
+ @k3 = "Long" * 40,
84
+ @k4 = "Medium" * 8,
85
+ @k5 = "Medium2" * 8,
86
+ @k6 = "Long3" * 40]
87
+
88
+ reset_servers
89
+ reset_clients
90
+
91
+ Benchmark.bm(36) do |x|
92
+ @benchmark = x
93
+ end
94
+ end
95
+
96
+ def run(level = @stack_depth)
97
+ level > 0 ? run(level - 1) : run_without_recursion
98
+ end
99
+
100
+ private
101
+
102
+ def reset_servers
103
+ system("ruby #{HERE}/../setup.rb")
104
+ sleep(1)
105
+ end
106
+
107
+ def reset_clients
108
+ @clients = {
109
+ "cache:libm:bin" => Cache::Compat.new(Memcached.new(['127.0.0.1:43042', '127.0.0.1:43043'], :buffer_requests => false, :no_block => false, :namespace => "namespace", :binary_protocol => true)),
110
+ "cache:dalli:bin" => Cache::Compat.new(Dalli::Client.new(['127.0.0.1:43042', '127.0.0.1:43043'], :marshal => false, :threadsafe => false)),
111
+ "libm:ascii" => Memcached::Rails.new(
112
+ ['127.0.0.1:43042', '127.0.0.1:43043'],
113
+ :buffer_requests => false, :no_block => false, :namespace => "namespace"),
114
+ "libm:ascii:pipeline" => Memcached::Rails.new(
115
+ ['127.0.0.1:43042', '127.0.0.1:43043'],
116
+ :no_block => true, :buffer_requests => true, :noreply => true, :namespace => "namespace"),
117
+ "libm:ascii:udp" => Memcached::Rails.new(
118
+ ["#{UNIX_SOCKET_NAME}0", "#{UNIX_SOCKET_NAME}1"],
119
+ :buffer_requests => false, :no_block => false, :namespace => "namespace"),
120
+ "libm:bin" => Memcached::Rails.new(
121
+ ['127.0.0.1:43042', '127.0.0.1:43043'],
122
+ :buffer_requests => false, :no_block => false, :namespace => "namespace", :binary_protocol => true),
123
+ "libm:bin:buffer" => Memcached::Rails.new(
124
+ ['127.0.0.1:43042', '127.0.0.1:43043'],
125
+ :no_block => true, :buffer_requests => true, :namespace => "namespace", :binary_protocol => true),
126
+ "mclient:ascii" => MemCache.new(['127.0.0.1:43042', '127.0.0.1:43043']),
127
+ "stash:bin" => Remix::Stash.new(:root),
128
+ "dalli:bin" => Dalli::ClientCompat.new(['127.0.0.1:43042', '127.0.0.1:43043'], :marshal => false, :threadsafe => false)}
129
+ end
130
+
131
+
132
+ def benchmark_clients(test_name, clients = @clients)
133
+ clients.keys.sort.each do |client_name|
134
+ next if client_name == "stash" and test_name == "set-large" # Don't let stash break the world
135
+ client = clients[client_name]
136
+ begin
137
+ yield client
138
+ @benchmark.report("#{test_name}: #{client_name}") { @loops.times { yield client } }
139
+ rescue Exception => e
140
+ puts "#{test_name}:#{client_name} => #{e.inspect}"
141
+ reset_clients
142
+ end
143
+ end
144
+ puts
145
+ end
146
+
147
+ def benchmark_hashes(hashes, test_name)
148
+ hashes.each do |hash_name, int|
149
+ @m = Memcached::Rails.new(:hash => hash_name)
150
+ @benchmark.report("#{test_name}:#{hash_name}") do
151
+ (@loops * 5).times { yield int }
152
+ end
153
+ end
154
+ end
155
+
156
+ def run_without_recursion
157
+ benchmark_clients("set") do |c|
158
+ c.set @k1, @m_value, 0, true
159
+ c.set @k2, @m_value, 0, true
160
+ c.set @k3, @m_value, 0, true
161
+ end
162
+
163
+ benchmark_clients("get") do |c|
164
+ c.get @k1, true
165
+ c.get @k2, true
166
+ c.get @k3, true
167
+ end
168
+
169
+ # benchmark_clients("get-multi") do |c|
170
+ # c.get_multi @keys, true
171
+ # end
172
+ #
173
+ # benchmark_clients("append") do |c|
174
+ # c.append @k1, @m_value
175
+ # c.append @k2, @m_value
176
+ # c.append @k3, @m_value
177
+ # end
178
+ #
179
+ # benchmark_clients("prepend") do |c|
180
+ # c.prepend @k1, @m_value
181
+ # c.prepend @k2, @m_value
182
+ # c.prepend @k3, @m_value
183
+ # end
184
+
185
+ benchmark_clients("delete") do |c|
186
+ c.delete @k1
187
+ c.delete @k2
188
+ c.delete @k3
189
+ end
190
+
191
+ benchmark_clients("get-missing") do |c|
192
+ c.get @k1
193
+ c.get @k2
194
+ c.get @k3
195
+ end
196
+
197
+ # benchmark_clients("append-missing") do |c|
198
+ # c.append @k1, @m_value
199
+ # c.append @k2, @m_value
200
+ # c.append @k3, @m_value
201
+ # end
202
+ #
203
+ # benchmark_clients("prepend-missing") do |c|
204
+ # c.prepend @k1, @m_value
205
+ # c.prepend @k2, @m_value
206
+ # c.prepend @k3, @m_value
207
+ # end
208
+
209
+ benchmark_clients("set-large") do |c|
210
+ c.set @k1, @m_large_value, 0, true
211
+ c.set @k2, @m_large_value, 0, true
212
+ c.set @k3, @m_large_value, 0, true
213
+ end
214
+
215
+ benchmark_clients("get-large") do |c|
216
+ c.get @k1, true
217
+ c.get @k2, true
218
+ c.get @k3, true
219
+ end
220
+
221
+ benchmark_hashes(Memcached::HASH_VALUES, "hash") do |i|
222
+ Rlibmemcached.memcached_generate_hash_rvalue(@k1, i)
223
+ Rlibmemcached.memcached_generate_hash_rvalue(@k2, i)
224
+ Rlibmemcached.memcached_generate_hash_rvalue(@k3, i)
225
+ Rlibmemcached.memcached_generate_hash_rvalue(@k4, i)
226
+ Rlibmemcached.memcached_generate_hash_rvalue(@k5, i)
227
+ Rlibmemcached.memcached_generate_hash_rvalue(@k6, i)
228
+ end
229
+ end
230
+ end
231
+
232
+ Bench.new(ENV["LOOPS"], ENV["STACK_DEPTH"]).run
233
+
234
+ Process.memory.each do |key, value|
235
+ puts "#{key}: #{value/1024.0}M"
236
+ end if Process.respond_to? :memory
@@ -3,9 +3,8 @@ require 'helper'
3
3
  require 'dalli'
4
4
 
5
5
  class TestDalliStorage < Test::Unit::TestCase
6
- def setup
7
- @client = Dalli::Client.new ['localhost:11211']
8
- super
6
+ def raw_client
7
+ Dalli::Client.new ['localhost:11211']
9
8
  end
10
9
 
11
10
  include SharedTests
@@ -5,9 +5,8 @@ require 'active_support/all'
5
5
  require 'active_support/cache/dalli_store'
6
6
 
7
7
  class TestDalliStoreStorage < Test::Unit::TestCase
8
- def setup
9
- @client = ActiveSupport::Cache::DalliStore.new ['localhost:11211']
10
- super
8
+ def raw_client
9
+ ActiveSupport::Cache::DalliStore.new ['localhost:11211']
11
10
  end
12
11
 
13
12
  include SharedTests
@@ -4,9 +4,8 @@ require 'helper'
4
4
  require 'memcache'
5
5
 
6
6
  class TestMemcacheStorage < Test::Unit::TestCase
7
- def setup
8
- @client = MemCache.new ['localhost:11211']
9
- super
7
+ def raw_client
8
+ MemCache.new ['localhost:11211']
10
9
  end
11
10
 
12
11
  include SharedTests
@@ -3,9 +3,8 @@ require 'helper'
3
3
  require 'memcached'
4
4
 
5
5
  class TestMemcachedRailsStorage < Test::Unit::TestCase
6
- def setup
7
- @client = Memcached::Rails.new 'localhost:11211'
8
- super
6
+ def raw_client
7
+ Memcached::Rails.new 'localhost:11211'
9
8
  end
10
9
 
11
10
  include SharedTests
@@ -3,9 +3,8 @@ require 'helper'
3
3
  require 'memcached'
4
4
 
5
5
  class TestMemcachedStorage < Test::Unit::TestCase
6
- def setup
7
- @client = Memcached.new 'localhost:11211'
8
- super
6
+ def raw_client
7
+ Memcached.new 'localhost:11211'
9
8
  end
10
9
 
11
10
  include SharedTests
@@ -5,10 +5,9 @@ if ENV['REDIS_URL']
5
5
  require 'uri'
6
6
 
7
7
  class TestRedisStorage < Test::Unit::TestCase
8
- def setup
8
+ def raw_client
9
9
  uri = URI.parse(ENV["REDIS_URL"])
10
- @client = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
11
- super
10
+ Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
12
11
  end
13
12
 
14
13
  include SharedTests
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cache
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Seamus Abshere
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-02-17 00:00:00 -06:00
18
+ date: 2011-02-22 00:00:00 -06:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -129,6 +129,7 @@ extra_rdoc_files: []
129
129
 
130
130
  files:
131
131
  - .gitignore
132
+ - BENCHMARKS
132
133
  - Gemfile
133
134
  - README.rdoc
134
135
  - Rakefile
@@ -138,6 +139,7 @@ files:
138
139
  - lib/cache/storage.rb
139
140
  - lib/cache/version.rb
140
141
  - test/helper.rb
142
+ - test/profile/benchmark.rb
141
143
  - test/shared_tests.rb
142
144
  - test/test_dalli_storage.rb
143
145
  - test/test_dalli_store_storage.rb
@@ -181,6 +183,7 @@ specification_version: 3
181
183
  summary: Wraps memcached, redis, memcache-client, dalli and handles their weirdnesses, including forking
182
184
  test_files:
183
185
  - test/helper.rb
186
+ - test/profile/benchmark.rb
184
187
  - test/shared_tests.rb
185
188
  - test/test_dalli_storage.rb
186
189
  - test/test_dalli_store_storage.rb