memcached 0.16.3 → 0.17

Sign up to get free protection for your applications and to get access to all the features.
@@ -6486,181 +6486,6 @@ fail:
6486
6486
  }
6487
6487
 
6488
6488
 
6489
- SWIGINTERN VALUE
6490
- _wrap_MemcachedSt_number_of_live_hosts_set(int argc, VALUE *argv, VALUE self) {
6491
- struct memcached_st *arg1 = (struct memcached_st *) 0 ;
6492
- uint32_t arg2 ;
6493
- void *argp1 = 0 ;
6494
- int res1 = 0 ;
6495
- void *argp2 ;
6496
- int res2 = 0 ;
6497
-
6498
- if ((argc < 1) || (argc > 1)) {
6499
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
6500
- }
6501
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_memcached_st, 0 | 0 );
6502
- if (!SWIG_IsOK(res1)) {
6503
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct memcached_st *","number_of_live_hosts", 1, self ));
6504
- }
6505
- arg1 = (struct memcached_st *)(argp1);
6506
- {
6507
- res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_uint32_t, 0 );
6508
- if (!SWIG_IsOK(res2)) {
6509
- SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "uint32_t","number_of_live_hosts", 2, argv[0] ));
6510
- }
6511
- if (!argp2) {
6512
- SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "uint32_t","number_of_live_hosts", 2, argv[0]));
6513
- } else {
6514
- arg2 = *((uint32_t *)(argp2));
6515
- }
6516
- }
6517
- if (arg1) (arg1)->number_of_live_hosts = arg2;
6518
- return Qnil;
6519
- fail:
6520
- return Qnil;
6521
- }
6522
-
6523
-
6524
- SWIGINTERN VALUE
6525
- _wrap_MemcachedSt_number_of_live_hosts_get(int argc, VALUE *argv, VALUE self) {
6526
- struct memcached_st *arg1 = (struct memcached_st *) 0 ;
6527
- void *argp1 = 0 ;
6528
- int res1 = 0 ;
6529
- uint32_t result;
6530
- VALUE vresult = Qnil;
6531
-
6532
- if ((argc < 0) || (argc > 0)) {
6533
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
6534
- }
6535
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_memcached_st, 0 | 0 );
6536
- if (!SWIG_IsOK(res1)) {
6537
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct memcached_st *","number_of_live_hosts", 1, self ));
6538
- }
6539
- arg1 = (struct memcached_st *)(argp1);
6540
- result = ((arg1)->number_of_live_hosts);
6541
- {
6542
- vresult = UINT2NUM(result);
6543
- }
6544
- return vresult;
6545
- fail:
6546
- return Qnil;
6547
- }
6548
-
6549
-
6550
- SWIGINTERN VALUE
6551
- _wrap_MemcachedSt_live_host_indices_set(int argc, VALUE *argv, VALUE self) {
6552
- struct memcached_st *arg1 = (struct memcached_st *) 0 ;
6553
- uint32_t *arg2 = (uint32_t *) 0 ;
6554
- void *argp1 = 0 ;
6555
- int res1 = 0 ;
6556
- void *argp2 = 0 ;
6557
- int res2 = 0 ;
6558
-
6559
- if ((argc < 1) || (argc > 1)) {
6560
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
6561
- }
6562
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_memcached_st, 0 | 0 );
6563
- if (!SWIG_IsOK(res1)) {
6564
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct memcached_st *","live_host_indices", 1, self ));
6565
- }
6566
- arg1 = (struct memcached_st *)(argp1);
6567
- res2 = SWIG_ConvertPtr(argv[0], &argp2,SWIGTYPE_p_uint32_t, SWIG_POINTER_DISOWN | 0 );
6568
- if (!SWIG_IsOK(res2)) {
6569
- SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "uint32_t *","live_host_indices", 2, argv[0] ));
6570
- }
6571
- arg2 = (uint32_t *)(argp2);
6572
- if (arg1) (arg1)->live_host_indices = arg2;
6573
- return Qnil;
6574
- fail:
6575
- return Qnil;
6576
- }
6577
-
6578
-
6579
- SWIGINTERN VALUE
6580
- _wrap_MemcachedSt_live_host_indices_get(int argc, VALUE *argv, VALUE self) {
6581
- struct memcached_st *arg1 = (struct memcached_st *) 0 ;
6582
- void *argp1 = 0 ;
6583
- int res1 = 0 ;
6584
- uint32_t *result = 0 ;
6585
- VALUE vresult = Qnil;
6586
-
6587
- if ((argc < 0) || (argc > 0)) {
6588
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
6589
- }
6590
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_memcached_st, 0 | 0 );
6591
- if (!SWIG_IsOK(res1)) {
6592
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct memcached_st *","live_host_indices", 1, self ));
6593
- }
6594
- arg1 = (struct memcached_st *)(argp1);
6595
- result = (uint32_t *) ((arg1)->live_host_indices);
6596
- vresult = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_uint32_t, 0 | 0 );
6597
- return vresult;
6598
- fail:
6599
- return Qnil;
6600
- }
6601
-
6602
-
6603
- SWIGINTERN VALUE
6604
- _wrap_MemcachedSt_live_host_indices_size_set(int argc, VALUE *argv, VALUE self) {
6605
- struct memcached_st *arg1 = (struct memcached_st *) 0 ;
6606
- uint32_t arg2 ;
6607
- void *argp1 = 0 ;
6608
- int res1 = 0 ;
6609
- void *argp2 ;
6610
- int res2 = 0 ;
6611
-
6612
- if ((argc < 1) || (argc > 1)) {
6613
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)",argc); SWIG_fail;
6614
- }
6615
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_memcached_st, 0 | 0 );
6616
- if (!SWIG_IsOK(res1)) {
6617
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct memcached_st *","live_host_indices_size", 1, self ));
6618
- }
6619
- arg1 = (struct memcached_st *)(argp1);
6620
- {
6621
- res2 = SWIG_ConvertPtr(argv[0], &argp2, SWIGTYPE_p_uint32_t, 0 );
6622
- if (!SWIG_IsOK(res2)) {
6623
- SWIG_exception_fail(SWIG_ArgError(res2), Ruby_Format_TypeError( "", "uint32_t","live_host_indices_size", 2, argv[0] ));
6624
- }
6625
- if (!argp2) {
6626
- SWIG_exception_fail(SWIG_ValueError, Ruby_Format_TypeError("invalid null reference ", "uint32_t","live_host_indices_size", 2, argv[0]));
6627
- } else {
6628
- arg2 = *((uint32_t *)(argp2));
6629
- }
6630
- }
6631
- if (arg1) (arg1)->live_host_indices_size = arg2;
6632
- return Qnil;
6633
- fail:
6634
- return Qnil;
6635
- }
6636
-
6637
-
6638
- SWIGINTERN VALUE
6639
- _wrap_MemcachedSt_live_host_indices_size_get(int argc, VALUE *argv, VALUE self) {
6640
- struct memcached_st *arg1 = (struct memcached_st *) 0 ;
6641
- void *argp1 = 0 ;
6642
- int res1 = 0 ;
6643
- uint32_t result;
6644
- VALUE vresult = Qnil;
6645
-
6646
- if ((argc < 0) || (argc > 0)) {
6647
- rb_raise(rb_eArgError, "wrong # of arguments(%d for 0)",argc); SWIG_fail;
6648
- }
6649
- res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p_memcached_st, 0 | 0 );
6650
- if (!SWIG_IsOK(res1)) {
6651
- SWIG_exception_fail(SWIG_ArgError(res1), Ruby_Format_TypeError( "", "struct memcached_st *","live_host_indices_size", 1, self ));
6652
- }
6653
- arg1 = (struct memcached_st *)(argp1);
6654
- result = ((arg1)->live_host_indices_size);
6655
- {
6656
- vresult = UINT2NUM(result);
6657
- }
6658
- return vresult;
6659
- fail:
6660
- return Qnil;
6661
- }
6662
-
6663
-
6664
6489
  #ifdef HAVE_RB_DEFINE_ALLOC_FUNC
6665
6490
  SWIGINTERN VALUE
6666
6491
  _wrap_MemcachedSt_allocate(VALUE self) {
@@ -12607,7 +12432,7 @@ SWIGEXPORT void Init_rlibmemcached(void) {
12607
12432
 
12608
12433
  SWIG_RubyInitializeTrackings();
12609
12434
  rb_define_const(mRlibmemcached, "MEMCACHED_VERSION_STRING_LENGTH", SWIG_From_int((int)(24)));
12610
- rb_define_const(mRlibmemcached, "LIBMEMCACHED_VERSION_STRING", SWIG_FromCharPtr("0.31"));
12435
+ rb_define_const(mRlibmemcached, "LIBMEMCACHED_VERSION_STRING", SWIG_FromCharPtr("0.32"));
12611
12436
 
12612
12437
  cMemcachedAnalysisSt.klass = rb_define_class_under(mRlibmemcached, "MemcachedAnalysisSt", rb_cObject);
12613
12438
  SWIG_TypeClientData(SWIGTYPE_p_memcached_analysis_st, (void *) &cMemcachedAnalysisSt);
@@ -12769,12 +12594,6 @@ SWIGEXPORT void Init_rlibmemcached(void) {
12769
12594
  rb_define_method(cMemcachedSt.klass, "prefix_key", _wrap_MemcachedSt_prefix_key_get, -1);
12770
12595
  rb_define_method(cMemcachedSt.klass, "number_of_replicas=", _wrap_MemcachedSt_number_of_replicas_set, -1);
12771
12596
  rb_define_method(cMemcachedSt.klass, "number_of_replicas", _wrap_MemcachedSt_number_of_replicas_get, -1);
12772
- rb_define_method(cMemcachedSt.klass, "number_of_live_hosts=", _wrap_MemcachedSt_number_of_live_hosts_set, -1);
12773
- rb_define_method(cMemcachedSt.klass, "number_of_live_hosts", _wrap_MemcachedSt_number_of_live_hosts_get, -1);
12774
- rb_define_method(cMemcachedSt.klass, "live_host_indices=", _wrap_MemcachedSt_live_host_indices_set, -1);
12775
- rb_define_method(cMemcachedSt.klass, "live_host_indices", _wrap_MemcachedSt_live_host_indices_get, -1);
12776
- rb_define_method(cMemcachedSt.klass, "live_host_indices_size=", _wrap_MemcachedSt_live_host_indices_size_set, -1);
12777
- rb_define_method(cMemcachedSt.klass, "live_host_indices_size", _wrap_MemcachedSt_live_host_indices_size_get, -1);
12778
12597
  cMemcachedSt.mark = 0;
12779
12598
  cMemcachedSt.destroy = (void (*)(void *)) memcached_free;
12780
12599
  cMemcachedSt.trackObjects = 0;
@@ -20,9 +20,8 @@ require 'rlibmemcached'
20
20
 
21
21
  class Memcached
22
22
  Lib = Rlibmemcached
23
- REQUIRED_VERSION = File.read("#{File.dirname(__FILE__)}/../COMPATIBILITY")[/:: ([\d\.]+)/, 1]
24
- RECEIVED_VERSION = Lib.memcached_lib_version
25
- raise "libmemcached #{REQUIRED_VERSION} required; you somehow linked to #{RECEIVED_VERSION}." unless REQUIRED_VERSION == RECEIVED_VERSION
23
+ raise "libmemcached 0.32 required; you somehow linked to #{Lib.memcached_lib_version}." unless "0.32" == Lib.memcached_lib_version
24
+ VERSION = File.read("#{File.dirname(__FILE__)}/../CHANGELOG")[/v([\d\.]+)\./, 1]
26
25
  end
27
26
 
28
27
  require 'memcached/integer'
@@ -78,7 +78,7 @@ Please note that when pipelining is enabled, setter and deleter methods do not r
78
78
 
79
79
  =end
80
80
 
81
- def initialize(servers, opts = {})
81
+ def initialize(servers = "localhost:11211", opts = {})
82
82
  @struct = Lib::MemcachedSt.new
83
83
  Lib.memcached_create(@struct)
84
84
 
@@ -104,8 +104,8 @@ Please note that when pipelining is enabled, setter and deleter methods do not r
104
104
  end
105
105
 
106
106
  # Read timeouts
107
- options[:rcv_timeout] ||= options[:timeout]
108
- options[:poll_timeout] ||= options[:timeout]
107
+ options[:rcv_timeout] ||= options[:timeout] || 0
108
+ options[:poll_timeout] ||= options[:timeout] || 0
109
109
 
110
110
  # Set the behaviors on the struct
111
111
  set_behaviors
@@ -126,6 +126,31 @@ Please note that when pipelining is enabled, setter and deleter methods do not r
126
126
  end
127
127
  end
128
128
 
129
+ # Set the server list.
130
+ # FIXME Does not necessarily free any existing server structs.
131
+ def set_servers(servers)
132
+ Array(servers).each_with_index do |server, index|
133
+ # Socket
134
+ if server.is_a?(String) and File.socket?(server)
135
+ args = [@struct, server, options[:default_weight].to_i]
136
+ check_return_code(Lib.memcached_server_add_unix_socket_with_weight(*args))
137
+ # Network
138
+ elsif server.is_a?(String) and server =~ /^[\w\d\.-]+(:\d{1,5}){0,2}$/
139
+ host, port, weight = server.split(":")
140
+ args = [@struct, host, port.to_i, (weight || options[:default_weight]).to_i]
141
+ if options[:use_udp] #
142
+ check_return_code(Lib.memcached_server_add_udp_with_weight(*args))
143
+ else
144
+ check_return_code(Lib.memcached_server_add_with_weight(*args))
145
+ end
146
+ else
147
+ raise ArgumentError, "Servers must be either in the format 'host:port[:weight]' (e.g., 'localhost:11211' or 'localhost:11211:10') for a network server, or a valid path to a Unix domain socket (e.g., /var/run/memcached)."
148
+ end
149
+ end
150
+ # For inspect
151
+ @servers = send(:servers)
152
+ end
153
+
129
154
  # Return the array of server strings used to configure this instance.
130
155
  def servers
131
156
  server_structs.map do |server|
@@ -427,30 +452,6 @@ Please note that when pipelining is enabled, setter and deleter methods do not r
427
452
  inspect_server(server) if server
428
453
  end
429
454
 
430
- # Set the servers on the struct.
431
- def set_servers(servers)
432
- Array(servers).each_with_index do |server, index|
433
- # Socket
434
- if server.is_a?(String) and File.socket?(server)
435
- args = [@struct, server, options[:default_weight].to_i]
436
- check_return_code(Lib.memcached_server_add_unix_socket_with_weight(*args))
437
- # Network
438
- elsif server.is_a?(String) and server =~ /^[\w\d\.-]+(:\d{1,5}){0,2}$/
439
- host, port, weight = server.split(":")
440
- args = [@struct, host, port.to_i, (weight || options[:default_weight]).to_i]
441
- if options[:use_udp] #
442
- check_return_code(Lib.memcached_server_add_udp_with_weight(*args))
443
- else
444
- check_return_code(Lib.memcached_server_add_with_weight(*args))
445
- end
446
- else
447
- raise ArgumentError, "Servers must be either in the format 'host:port[:weight]' (e.g., 'localhost:11211' or 'localhost:11211:10') for a network server, or a valid path to a Unix domain socket (e.g., /var/run/memcached)."
448
- end
449
- end
450
- # For inspect
451
- @servers = send(:servers)
452
- end
453
-
454
455
  # Set the behaviors on the struct from the current options.
455
456
  def set_behaviors
456
457
  BEHAVIORS.keys.each do |behavior|
@@ -1,13 +1,14 @@
1
-
2
1
  class Memcached
3
2
 
4
- alias :get_multi :get #:nodoc:
3
+ (instance_methods - NilClass.instance_methods).each do |method_name|
4
+ eval("alias :'#{method_name}_orig' :'#{method_name}'")
5
+ end
5
6
 
6
7
  # A legacy compatibility wrapper for the Memcached class. It has basic compatibility with the <b>memcache-client</b> API.
7
8
  class Rails < ::Memcached
8
-
9
- DEFAULTS = {}
10
-
9
+
10
+ alias :servers= :set_servers
11
+
11
12
  # See Memcached#new for details.
12
13
  def initialize(*args)
13
14
  opts = args.last.is_a?(Hash) ? args.pop : {}
@@ -16,10 +17,10 @@ class Memcached
16
17
  ).flatten.compact
17
18
 
18
19
  opts[:prefix_key] ||= opts[:namespace]
19
- super(servers, DEFAULTS.merge(opts))
20
+ super(servers, opts)
20
21
  end
21
-
22
- # Wraps Memcached#get so that it doesn't raise. This has the side-effect of preventing you from
22
+
23
+ # Wraps Memcached#get so that it doesn't raise. This has the side-effect of preventing you from
23
24
  # storing <tt>nil</tt> values.
24
25
  def get(key, raw=false)
25
26
  super(key, !raw)
@@ -29,56 +30,68 @@ class Memcached
29
30
  # Wraps Memcached#cas so that it doesn't raise. Doesn't set anything if no value is present.
30
31
  def cas(key, ttl=@default_ttl, raw=false, &block)
31
32
  super(key, ttl, !raw, &block)
32
- rescue NotFound
33
+ rescue NotFound
33
34
  end
34
-
35
- alias :compare_and_swap :cas
36
-
35
+
36
+ alias :compare_and_swap :cas
37
+
37
38
  # Wraps Memcached#get.
38
39
  def get_multi(keys, raw=false)
39
- super(keys, !raw)
40
+ get_orig(keys, !raw)
40
41
  end
41
-
42
+
42
43
  # Wraps Memcached#set.
43
44
  def set(key, value, ttl=@default_ttl, raw=false)
44
45
  super(key, value, ttl, !raw)
45
46
  end
46
47
 
47
- # Wraps Memcached#add so that it doesn't raise.
48
+ # Wraps Memcached#add so that it doesn't raise.
48
49
  def add(key, value, ttl=@default_ttl, raw=false)
49
50
  super(key, value, ttl, !raw)
50
51
  true
51
52
  rescue NotStored
52
- false
53
+ false
53
54
  end
54
-
55
- # Wraps Memcached#delete so that it doesn't raise.
55
+
56
+ # Wraps Memcached#delete so that it doesn't raise.
56
57
  def delete(key)
57
58
  super
58
59
  rescue NotFound
59
60
  end
60
-
61
- # Wraps Memcached#incr so that it doesn't raise.
61
+
62
+ # Wraps Memcached#incr so that it doesn't raise.
62
63
  def incr(*args)
63
64
  super
64
65
  rescue NotFound
65
66
  end
66
67
 
67
- # Wraps Memcached#decr so that it doesn't raise.
68
+ # Wraps Memcached#decr so that it doesn't raise.
68
69
  def decr(*args)
69
70
  super
70
71
  rescue NotFound
71
72
  end
72
-
73
+
74
+ # Wraps Memcached#append so that it doesn't raise.
75
+ def append(*args)
76
+ super
77
+ rescue NotStored
78
+ end
79
+
80
+ # Wraps Memcached#prepend so that it doesn't raise.
81
+ def prepend(*args)
82
+ super
83
+ rescue NotStored
84
+ end
85
+
73
86
  # Namespace accessor.
74
87
  def namespace
75
88
  options[:prefix_key]
76
89
  end
77
-
90
+
78
91
  alias :flush_all :flush
79
92
 
80
93
  alias :"[]" :get
81
- alias :"[]=" :set
82
-
94
+ alias :"[]=" :set
95
+
83
96
  end
84
97
  end
@@ -2,17 +2,17 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{memcached}
5
- s.version = "0.16.3"
5
+ s.version = "0.17"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Evan Weaver"]
9
9
  s.cert_chain = ["/Users/eweaver/p/configuration/gem_certificates/evan_weaver-original-public_cert.pem"]
10
- s.date = %q{2009-09-04}
10
+ s.date = %q{2009-09-21}
11
11
  s.description = %q{An interface to the libmemcached C client.}
12
12
  s.email = %q{}
13
13
  s.extensions = ["ext/extconf.rb"]
14
- s.extra_rdoc_files = ["BENCHMARKS", "CHANGELOG", "COMPATIBILITY", "lib/memcached/behaviors.rb", "lib/memcached/exceptions.rb", "lib/memcached/memcached.rb", "lib/memcached/rails.rb", "lib/memcached.rb", "LICENSE", "README", "TODO"]
15
- s.files = ["BENCHMARKS", "CHANGELOG", "COMPATIBILITY", "ext/extconf.rb", "ext/libmemcached-0.31.tar.gz", "ext/rlibmemcached.i", "ext/rlibmemcached_wrap.c", "lib/memcached/behaviors.rb", "lib/memcached/exceptions.rb", "lib/memcached/integer.rb", "lib/memcached/memcached.rb", "lib/memcached/rails.rb", "lib/memcached.rb", "LICENSE", "Manifest", "Rakefile", "README", "test/profile/benchmark.rb", "test/profile/profile.rb", "test/profile/valgrind.rb", "test/setup.rb", "test/teardown.rb", "test/test_helper.rb", "test/unit/binding_test.rb", "test/unit/memcached_test.rb", "test/unit/rails_test.rb", "TODO", "memcached.gemspec"]
14
+ s.extra_rdoc_files = ["BENCHMARKS", "CHANGELOG", "LICENSE", "README", "TODO", "lib/memcached.rb", "lib/memcached/behaviors.rb", "lib/memcached/exceptions.rb", "lib/memcached/memcached.rb", "lib/memcached/rails.rb"]
15
+ s.files = ["BENCHMARKS", "CHANGELOG", "LICENSE", "Manifest", "README", "Rakefile", "TODO", "ext/extconf.rb", "ext/libmemcached-0.32.tar.gz", "ext/libmemcached.patch", "ext/rlibmemcached.i", "ext/rlibmemcached_wrap.c", "lib/memcached.rb", "lib/memcached/behaviors.rb", "lib/memcached/exceptions.rb", "lib/memcached/integer.rb", "lib/memcached/memcached.rb", "lib/memcached/rails.rb", "test/profile/benchmark.rb", "test/profile/profile.rb", "test/profile/valgrind.rb", "test/setup.rb", "test/teardown.rb", "test/test_helper.rb", "test/unit/binding_test.rb", "test/unit/memcached_test.rb", "test/unit/rails_test.rb", "memcached.gemspec"]
16
16
  s.homepage = %q{http://blog.evanweaver.com/files/doc/fauna/memcached/}
17
17
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Memcached", "--main", "README"]
18
18
  s.require_paths = ["lib", "ext"]
@@ -9,506 +9,202 @@ require 'rubygems'
9
9
  require 'ruby-debug' if ENV['DEBUG']
10
10
  begin; require 'memory'; rescue LoadError; end
11
11
 
12
- ARGV << "--with-memcached" << "--with-memcache-client" if ARGV.join !~ /--with/
13
-
14
12
  puts `uname -a`
15
13
  puts "Ruby #{RUBY_VERSION}p#{RUBY_PATCHLEVEL}"
16
14
 
17
- ARGV.each do |flag|
18
- require_name = flag[/--with-(\w+)/, 1]
19
- gem_name = flag[/--with-(.*)$/, 1]
20
- begin
21
- require require_name
22
- gem gem_name
23
- puts "Loaded #{$1} #{Gem.loaded_specs[gem_name].version.to_s rescue nil}"
24
- rescue LoadError
25
- end
15
+ [ ["memcached", "memcached"],
16
+ ["binary42-remix-stash", "remix/stash"],
17
+ # ["astro-remcached", "remcached"], # Clobbers the "Memcached" constant
18
+ ["memcache-client", "memcache"]].each do |gem_name, requirement|
19
+ require requirement
20
+ gem gem_name
21
+ puts "Loaded #{gem_name} #{Gem.loaded_specs[gem_name].version.to_s rescue nil}"
26
22
  end
27
23
 
28
- recursion = ARGV.grep(/--recursion/).first[/(\d+)/, 1].to_i rescue 0
24
+ class Remix::Stash
25
+ # Remix::Stash API doesn't let you set servers
26
+ @@clusters = {:default => Remix::Stash::Cluster.new(['127.0.0.1:43042', '127.0.0.1:43043'])}
27
+ end
29
28
 
30
29
  class Bench
31
30
 
32
- def initialize(recursion)
33
-
34
- @recursion = recursion
35
- puts "Recursion level is #{@recursion}"
31
+ def initialize(loops = nil, stack_depth = nil)
32
+ @loops = (loops || 20000).to_i
33
+ @stack_depth = (stack_depth || 0).to_i
36
34
 
37
- # We'll use a simple @value to try to avoid spending time in Marshal,
38
- # which is a constant penalty that both clients have to pay
39
- @value = []
40
- @marshalled = Marshal.dump(@value)
35
+ puts "Loops is #{@loops}"
36
+ puts "Stack depth is #{@stack_depth}"
37
+
38
+ @m_value = Marshal.dump(
39
+ @small_value = ["testing"])
40
+ @m_large_value = Marshal.dump(
41
+ @large_value = [{"test" => "1", "test2" => "2", Object.new => "3", 4 => 4, "test5" => 2**65}] * 2048)
42
+
43
+ puts "Small value size is: #{@m_value.size} bytes"
44
+ puts "Large value size is: #{@m_large_value.size} bytes"
45
+
46
+ @keys = [
47
+ @k1 = "Short",
48
+ @k2 = "Sym1-2-3::45" * 8,
49
+ @k3 = "Long" * 40,
50
+ @k4 = "Medium" * 8,
51
+ @k5 = "Medium2" * 8,
52
+ @k6 = "Long3" * 40]
41
53
 
42
- @opts_networked = [
43
- ['127.0.0.1:43042', '127.0.0.1:43043'],
44
- {:buffer_requests => false, :no_block => false, :namespace => "namespace"}
45
- ]
46
- @opt_unix = [
47
- ["#{UNIX_SOCKET_NAME}0","#{UNIX_SOCKET_NAME}1"],
48
- {:buffer_requests => false, :no_block => false, :namespace => "namespace"}
49
- ]
50
- @key1 = "Short"
51
- @key2 = "Sym1-2-3::45"*8
52
- @key3 = "Long"*40
53
- @key4 = "Medium"*8
54
- # 5 and 6 are only used for multiget miss test
55
- @key5 = "Medium2"*8
56
- @key6 = "Long3"*40
54
+ reset_servers
55
+ reset_clients
57
56
 
58
- system("ruby #{HERE}/../setup.rb")
59
- sleep(1)
57
+ Benchmark.bm(36) do |x|
58
+ @benchmark = x
59
+ end
60
60
  end
61
61
 
62
- def run(level = @recursion)
63
- level > 0 ? run(level - 1) : benchmark
62
+ def run(level = @stack_depth)
63
+ level > 0 ? run(level - 1) : run_without_recursion
64
64
  end
65
65
 
66
66
  private
67
67
 
68
- def benchmark
69
- Benchmark.bm(35) do |x|
70
-
71
- n = (ENV["LOOPS"] || 10000).to_i
72
-
73
- if defined? Memcached
74
- @m = Memcached.new(
75
- @opts_networked[0],
76
- @opts_networked[1].merge(:no_block => true, :buffer_requests => true)
77
- )
78
- x.report("set:plain:noblock:memcached:net") do
79
- n.times do
80
- @m.set @key1, @marshalled, 0, false
81
- @m.set @key2, @marshalled, 0, false
82
- @m.set @key3, @marshalled, 0, false
83
- @m.set @key1, @marshalled, 0, false
84
- @m.set @key2, @marshalled, 0, false
85
- @m.set @key3, @marshalled, 0, false
86
- end
87
- end
88
- @m = Memcached.new(
89
- @opt_unix[0],
90
- @opt_unix[1].merge(:no_block => true, :buffer_requests => true)
91
- )
92
- x.report("set:plain:noblock:memcached:uds") do
93
- n.times do
94
- @m.set @key1, @marshalled, 0, false
95
- @m.set @key2, @marshalled, 0, false
96
- @m.set @key3, @marshalled, 0, false
97
- @m.set @key1, @marshalled, 0, false
98
- @m.set @key2, @marshalled, 0, false
99
- @m.set @key3, @marshalled, 0, false
100
- end
101
- end
102
- @m = Memcached.new(*@opts_networked)
103
- x.report("set:plain:memcached:net") do
104
- n.times do
105
- @m.set @key1, @marshalled, 0, false
106
- @m.set @key2, @marshalled, 0, false
107
- @m.set @key3, @marshalled, 0, false
108
- @m.set @key1, @marshalled, 0, false
109
- @m.set @key2, @marshalled, 0, false
110
- @m.set @key3, @marshalled, 0, false
111
- end
112
- end # if false
113
- @m = Memcached.new(*@opt_unix)
114
- x.report("set:plain:memcached:uds") do
115
- n.times do
116
- @m.set @key1, @marshalled, 0, false
117
- @m.set @key2, @marshalled, 0, false
118
- @m.set @key3, @marshalled, 0, false
119
- @m.set @key1, @marshalled, 0, false
120
- @m.set @key2, @marshalled, 0, false
121
- @m.set @key3, @marshalled, 0, false
122
- end
123
- end
124
- end
125
- if defined? MemCache
126
- @m = MemCache.new(*@opts_networked)
127
- x.report("set:plain:memcache-client") do
128
- n.times do
129
- @m.set @key1, @marshalled, 0, true
130
- @m.set @key2, @marshalled, 0, true
131
- @m.set @key3, @marshalled, 0, true
132
- @m.set @key1, @marshalled, 0, true
133
- @m.set @key2, @marshalled, 0, true
134
- @m.set @key3, @marshalled, 0, true
135
- end
136
- end
137
- end
138
-
139
- if defined? Memcached
140
- @m = Memcached.new(
141
- @opts_networked[0],
142
- @opts_networked[1].merge(:no_block => true, :buffer_requests => true)
143
- )
144
- x.report("set:ruby:noblock:memcached:net") do
145
- n.times do
146
- @m.set @key1, @value
147
- @m.set @key2, @value
148
- @m.set @key3, @value
149
- @m.set @key1, @value
150
- @m.set @key2, @value
151
- @m.set @key3, @value
152
- end
153
- end
154
- @m = Memcached.new(
155
- @opt_unix[0],
156
- @opt_unix[1].merge(:no_block => true, :buffer_requests => true)
157
- )
158
- x.report("set:ruby:noblock:memcached:uds") do
159
- n.times do
160
- @m.set @key1, @value
161
- @m.set @key2, @value
162
- @m.set @key3, @value
163
- @m.set @key1, @value
164
- @m.set @key2, @value
165
- @m.set @key3, @value
166
- end
167
- end
168
- @m = Memcached.new(*@opts_networked)
169
- x.report("set:ruby:memcached:net") do
170
- n.times do
171
- @m.set @key1, @value
172
- @m.set @key2, @value
173
- @m.set @key3, @value
174
- @m.set @key1, @value
175
- @m.set @key2, @value
176
- @m.set @key3, @value
177
- end
178
- end # if false
179
- @m = Memcached.new(*@opt_unix)
180
- x.report("set:ruby:memcached:uds") do
181
- n.times do
182
- @m.set @key1, @value
183
- @m.set @key2, @value
184
- @m.set @key3, @value
185
- @m.set @key1, @value
186
- @m.set @key2, @value
187
- @m.set @key3, @value
188
- end
189
- end
190
- end
191
- if defined? MemCache
192
- @m = MemCache.new(*@opts_networked)
193
- x.report("set:ruby:memcache-client") do
194
- n.times do
195
- @m.set @key1, @value
196
- @m.set @key2, @value
197
- @m.set @key3, @value
198
- @m.set @key1, @value
199
- @m.set @key2, @value
200
- @m.set @key3, @value
201
- end
202
- end
68
+ def reset_servers
69
+ system("ruby #{HERE}/../setup.rb")
70
+ sleep(1)
71
+ end
72
+
73
+ def reset_clients
74
+ @clients = {
75
+ "libm" => Memcached::Rails.new(
76
+ ['127.0.0.1:43042', '127.0.0.1:43043'],
77
+ :buffer_requests => false, :no_block => false, :namespace => "namespace"),
78
+ "libm:noblock" => Memcached::Rails.new(
79
+ ['127.0.0.1:43042', '127.0.0.1:43043'],
80
+ :no_block => true, :buffer_requests => true, :namespace => "namespace"),
81
+ "libm:udp" => Memcached::Rails.new(
82
+ ["#{UNIX_SOCKET_NAME}0", "#{UNIX_SOCKET_NAME}1"],
83
+ :buffer_requests => false, :no_block => false, :namespace => "namespace"),
84
+ "libm:binary" => Memcached::Rails.new(
85
+ ['127.0.0.1:43042', '127.0.0.1:43043'],
86
+ :buffer_requests => false, :no_block => false, :namespace => "namespace", :binary_protocol => true),
87
+ "libm:noblock_binary" => Memcached::Rails.new(
88
+ ['127.0.0.1:43042', '127.0.0.1:43043'],
89
+ :no_block => true, :buffer_requests => true, :namespace => "namespace", :binary_protocol => true),
90
+ "ruby" => MemCache.new(['127.0.0.1:43042', '127.0.0.1:43043'], :namespace => "namespace"),
91
+ "stash" => Remix::Stash.new(:root)}
92
+ end
93
+
94
+
95
+ def benchmark_clients(test_name, clients = @clients)
96
+ clients.keys.sort.each do |client_name|
97
+ next if client_name == "stash" and test_name == "set-large" # Don't let stash break the world
98
+ client = clients[client_name]
99
+ begin
100
+ yield client
101
+ @benchmark.report("#{test_name}:#{client_name}") { @loops.times { yield client } }
102
+ rescue => e
103
+ # puts "#{test_name}:#{client_name} => #{e.class}"
104
+ # reset_clients
105
+ end
106
+ end
107
+ end
108
+
109
+ def benchmark_hashes(hashes, test_name)
110
+ hashes.each do |hash_name, int|
111
+ @m = Memcached::Rails.new(:hash => hash_name)
112
+ @benchmark.report("#{test_name}:#{hash_name}") do
113
+ @loops.times { yield int }
203
114
  end
115
+ end
116
+ end
117
+
118
+ def run_without_recursion
119
+ benchmark_clients("set") do |c|
120
+ c.set @k1, @m_value, 0, true
121
+ c.set @k2, @m_value, 0, true
122
+ c.set @k3, @m_value, 0, true
123
+ end
124
+
125
+ benchmark_clients("get") do |c|
126
+ c.get @k1, true
127
+ c.get @k2, true
128
+ c.get @k3, true
129
+ end
204
130
 
205
- if defined? Memcached
206
- @m = Memcached.new(*@opts_networked)
207
- x.report("get:plain:memcached:net") do
208
- n.times do
209
- @m.get @key1, false
210
- @m.get @key2, false
211
- @m.get @key3, false
212
- @m.get @key1, false
213
- @m.get @key2, false
214
- @m.get @key3, false
215
- end
216
- end
217
- @m = Memcached.new(*@opt_unix)
218
- x.report("get:plain:memcached:uds") do
219
- n.times do
220
- @m.get @key1, false
221
- @m.get @key2, false
222
- @m.get @key3, false
223
- @m.get @key1, false
224
- @m.get @key2, false
225
- @m.get @key3, false
226
- end
227
- end
228
- end
229
- if defined? MemCache
230
- @m = MemCache.new(*@opts_networked)
231
- x.report("get:plain:memcache-client") do
232
- n.times do
233
- @m.get @key1, true
234
- @m.get @key2, true
235
- @m.get @key3, true
236
- @m.get @key1, true
237
- @m.get @key2, true
238
- @m.get @key3, true
239
- end
240
- end
241
- end
131
+ benchmark_clients("get-multi") do |c|
132
+ c.get_multi @keys, true
133
+ end
242
134
 
243
- if defined? Memcached
244
- @m = Memcached.new(*@opts_networked)
245
- x.report("get:ruby:memcached:net") do
246
- n.times do
247
- @m.get @key1
248
- @m.get @key2
249
- @m.get @key3
250
- @m.get @key1
251
- @m.get @key2
252
- @m.get @key3
253
- end
254
- end
255
- @m = Memcached.new(*@opt_unix)
256
- x.report("get:ruby:memcached:uds") do
257
- n.times do
258
- @m.get @key1
259
- @m.get @key2
260
- @m.get @key3
261
- @m.get @key1
262
- @m.get @key2
263
- @m.get @key3
264
- end
265
- end
266
- end
267
- if defined? MemCache
268
- @m = MemCache.new(*@opts_networked)
269
- x.report("get:ruby:memcache-client") do
270
- n.times do
271
- @m.get @key1
272
- @m.get @key2
273
- @m.get @key3
274
- @m.get @key1
275
- @m.get @key2
276
- @m.get @key3
277
- end
278
- end
279
- end
280
-
281
- if defined? Memcached
282
- @m = Memcached.new(*@opts_networked)
283
-
284
- # Avoid rebuilding the array every request
285
- keys = [@key1, @key2, @key3, @key4, @key5, @key6]
286
-
287
- x.report("multiget:ruby:memcached:net") do
288
- n.times do
289
- @m.get keys
290
- end
291
- end
292
- @m = Memcached.new(*@opt_unix)
293
-
294
- # Avoid rebuilding the array every request
295
- keys = [@key1, @key2, @key3, @key4, @key5, @key6]
296
-
297
- x.report("multiget:ruby:memcached:uds") do
298
- n.times do
299
- @m.get keys
300
- end
301
- end
302
- end
303
- if defined? MemCache
304
- @m = MemCache.new(*@opts_networked)
305
- x.report("multiget:ruby:memcache-client") do
306
- n.times do
307
- # We don't use the keys array because splat is slow
308
- @m.get_multi @key1, @key2, @key3, @key4, @key5, @key6
309
- end
310
- end
311
- end
135
+ benchmark_clients("append") do |c|
136
+ c.append @k1, @m_value
137
+ c.append @k2, @m_value
138
+ c.append @k3, @m_value
139
+ end
312
140
 
313
- if defined? Memcached
314
- @m = Memcached.new(*@opts_networked)
315
- x.report("get-miss:ruby:memcached:net") do
316
- n.times do
317
- begin @m.delete @key1; rescue Memcached::NotFound; end
318
- begin @m.delete @key2; rescue Memcached::NotFound; end
319
- begin @m.delete @key3; rescue Memcached::NotFound; end
320
- begin @m.get @key1; rescue Memcached::NotFound; end
321
- begin @m.get @key2; rescue Memcached::NotFound; end
322
- begin @m.get @key3; rescue Memcached::NotFound; end
323
- end
324
- end
325
- @m = Memcached.new(*@opt_unix)
326
- x.report("get-miss:ruby:memcached:uds") do
327
- n.times do
328
- begin @m.delete @key1; rescue Memcached::NotFound; end
329
- begin @m.delete @key2; rescue Memcached::NotFound; end
330
- begin @m.delete @key3; rescue Memcached::NotFound; end
331
- begin @m.get @key1; rescue Memcached::NotFound; end
332
- begin @m.get @key2; rescue Memcached::NotFound; end
333
- begin @m.get @key3; rescue Memcached::NotFound; end
334
- end
335
- end
336
- end
337
-
338
- if defined? MemCache
339
- @m = MemCache.new(*@opts_networked)
340
- x.report("get-miss:ruby:memcache-client") do
341
- n.times do
342
- begin @m.delete @key1; rescue; end
343
- begin @m.delete @key2; rescue; end
344
- begin @m.delete @key3; rescue; end
345
- begin @m.get @key1; rescue; end
346
- begin @m.get @key2; rescue; end
347
- begin @m.get @key3; rescue; end
348
- end
349
- end
350
- end
351
-
352
- if defined? Memcached
353
- @m = Memcached.new(*@opts_networked)
354
- x.report("append-miss:ruby:memcached:net") do
355
- n.times do
356
- begin @m.delete @key1; rescue Memcached::NotFound; end
357
- begin @m.delete @key2; rescue Memcached::NotFound; end
358
- begin @m.delete @key3; rescue Memcached::NotFound; end
359
- begin @m.append @key1, @value; rescue Memcached::NotStored; end
360
- begin @m.append @key2, @value; rescue Memcached::NotStored; end
361
- begin @m.append @key3, @value; rescue Memcached::NotStored; end
362
- end
363
- end
364
- @m = Memcached.new(*@opt_unix)
365
- x.report("append-miss:ruby:memcached:uds") do
366
- n.times do
367
- begin @m.delete @key1; rescue Memcached::NotFound; end
368
- begin @m.delete @key2; rescue Memcached::NotFound; end
369
- begin @m.delete @key3; rescue Memcached::NotFound; end
370
- begin @m.append @key1, @value; rescue Memcached::NotStored; end
371
- begin @m.append @key2, @value; rescue Memcached::NotStored; end
372
- begin @m.append @key3, @value; rescue Memcached::NotStored; end
373
- end
374
- end
375
- end
376
- if defined? MemCache
377
- @m = MemCache.new(*@opts_networked)
378
- x.report("append-miss:ruby:memcache-client") do
379
- n.times do
380
- begin @m.delete @key1; rescue; end
381
- begin @m.delete @key2; rescue; end
382
- begin @m.delete @key3; rescue; end
383
- begin @m.append @key1, @value; rescue; end
384
- begin @m.append @key2, @value; rescue; end
385
- begin @m.append @key3, @value; rescue; end
386
- end
387
- end
388
- end
389
-
390
- if defined? Memcached
391
- @m = Memcached.new(
392
- @opts_networked[0],
393
- @opts_networked[1].merge(:no_block => true, :buffer_requests => true)
394
- )
395
- x.report("mixed:ruby:noblock:memcached:net") do
396
- n.times do
397
- @m.set @key1, @value
398
- @m.set @key2, @value
399
- @m.set @key3, @value
400
- @m.get @key1
401
- @m.get @key2
402
- @m.get @key3
403
- @m.set @key1, @value
404
- @m.get @key1
405
- @m.set @key2, @value
406
- @m.get @key2
407
- @m.set @key3, @value
408
- @m.get @key3
409
- end
410
- end
411
- @m = Memcached.new(
412
- @opt_unix[0],
413
- @opt_unix[1].merge(:no_block => true, :buffer_requests => true)
414
- )
415
- x.report("mixed:ruby:noblock:memcached:uds") do
416
- n.times do
417
- @m.set @key1, @value
418
- @m.set @key2, @value
419
- @m.set @key3, @value
420
- @m.get @key1
421
- @m.get @key2
422
- @m.get @key3
423
- @m.set @key1, @value
424
- @m.get @key1
425
- @m.set @key2, @value
426
- @m.get @key2
427
- @m.set @key3, @value
428
- @m.get @key3
429
- end
430
- end
431
- @m = Memcached.new(*@opts_networked)
432
- x.report("mixed:ruby:memcached:net") do
433
- n.times do
434
- @m.set @key1, @value
435
- @m.set @key2, @value
436
- @m.set @key3, @value
437
- @m.get @key1
438
- @m.get @key2
439
- @m.get @key3
440
- @m.set @key1, @value
441
- @m.get @key1
442
- @m.set @key2, @value
443
- @m.get @key2
444
- @m.set @key3, @value
445
- @m.get @key3
446
- end
447
- end # if false
448
- @m = Memcached.new(*@opt_unix)
449
- x.report("mixed:ruby:memcached:uds") do
450
- n.times do
451
- @m.set @key1, @value
452
- @m.set @key2, @value
453
- @m.set @key3, @value
454
- @m.get @key1
455
- @m.get @key2
456
- @m.get @key3
457
- @m.set @key1, @value
458
- @m.get @key1
459
- @m.set @key2, @value
460
- @m.get @key2
461
- @m.set @key3, @value
462
- @m.get @key3
463
- end
464
- end # if false
465
- end
466
- if defined? MemCache
467
- @m = MemCache.new(*@opts_networked)
468
- x.report("mixed:ruby:memcache-client") do
469
- n.times do
470
- @m.set @key1, @value
471
- @m.set @key2, @value
472
- @m.set @key3, @value
473
- @m.get @key1
474
- @m.get @key2
475
- @m.get @key3
476
- @m.set @key1, @value
477
- @m.get @key1
478
- @m.set @key2, @value
479
- @m.get @key2
480
- @m.set @key3, @value
481
- @m.get @key3
482
- end
483
- end
484
- end
141
+ benchmark_clients("delete") do |c|
142
+ c.delete @k1
143
+ c.delete @k2
144
+ c.delete @k3
145
+ end
485
146
 
486
- if defined? Memcached
487
- unless ARGV.include? "--no-hash"
488
- Memcached::HASH_VALUES.each do |mode, int|
489
- @m = Memcached.new(@opt_unix[0], @opt_unix[1].merge(:hash => mode))
490
- x.report("hash:#{mode}") do
491
- n.times do
492
- Rlibmemcached.memcached_generate_hash_rvalue(@key1, int)
493
- Rlibmemcached.memcached_generate_hash_rvalue(@key2, int)
494
- Rlibmemcached.memcached_generate_hash_rvalue(@key3, int)
495
- Rlibmemcached.memcached_generate_hash_rvalue(@key4, int)
496
- Rlibmemcached.memcached_generate_hash_rvalue(@key5, int)
497
- Rlibmemcached.memcached_generate_hash_rvalue(@key6, int)
498
- end
499
- end
500
- end
501
- end
502
- end
503
-
504
- end
147
+ benchmark_clients("get-missing") do |c|
148
+ c.get @k1
149
+ c.get @k2
150
+ c.get @k3
151
+ end
152
+
153
+ benchmark_clients("append-missing") do |c|
154
+ c.append @k1, @m_value
155
+ c.append @k2, @m_value
156
+ c.append @k3, @m_value
157
+ end
158
+
159
+ benchmark_clients("set-large") do |c|
160
+ c.set @k1, @m_large_value, 0, true
161
+ c.set @k2, @m_large_value, 0, true
162
+ c.set @k3, @m_large_value, 0, true
163
+ end
164
+
165
+ benchmark_clients("get-large") do |c|
166
+ c.get @k1, true
167
+ c.get @k2, true
168
+ c.get @k3, true
169
+ end
170
+
171
+ benchmark_clients("set-ruby") do |c|
172
+ c.set @k1, @value
173
+ c.set @k2, @value
174
+ c.set @k3, @value
175
+ end
176
+
177
+ benchmark_clients("get-ruby") do |c|
178
+ c.get @k1
179
+ c.get @k2
180
+ c.get @k3
181
+ end
182
+
183
+ benchmark_clients("set-ruby-large") do |c|
184
+ c.set @k1, @large_value
185
+ c.set @k2, @large_value
186
+ c.set @k3, @large_value
187
+ end
188
+
189
+ benchmark_clients("get-ruby-large") do |c|
190
+ c.get @k1
191
+ c.get @k2
192
+ c.get @k3
193
+ end
194
+
195
+ benchmark_hashes(Memcached::HASH_VALUES, "hash") do |i|
196
+ Rlibmemcached.memcached_generate_hash_rvalue(@k1, i)
197
+ Rlibmemcached.memcached_generate_hash_rvalue(@k2, i)
198
+ Rlibmemcached.memcached_generate_hash_rvalue(@k3, i)
199
+ Rlibmemcached.memcached_generate_hash_rvalue(@k4, i)
200
+ Rlibmemcached.memcached_generate_hash_rvalue(@k5, i)
201
+ Rlibmemcached.memcached_generate_hash_rvalue(@k6, i)
202
+ end
505
203
  end
506
204
  end
507
205
 
508
- Bench.new(recursion).run
206
+ Bench.new(ENV["LOOPS"], ENV["STACK_DEPTH"]).run
509
207
 
510
- if Process.respond_to? :memory
511
- Process.memory.each do |key, value|
512
- puts "#{key}: #{value/1024.0}M"
513
- end
514
- end
208
+ Process.memory.each do |key, value|
209
+ puts "#{key}: #{value/1024.0}M"
210
+ end if Process.respond_to? :memory