memcached 0.16.3 → 0.17

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.
@@ -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