kamal-railsbench 0.9.9.pre

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.
Files changed (54) hide show
  1. data/BUGS +2 -0
  2. data/CHANGELOG +2124 -0
  3. data/GCPATCH +73 -0
  4. data/INSTALL +75 -0
  5. data/LICENSE +222 -0
  6. data/Manifest.txt +53 -0
  7. data/PROBLEMS +56 -0
  8. data/README +337 -0
  9. data/Rakefile +51 -0
  10. data/bin/railsbench +80 -0
  11. data/config/benchmarking.rb +21 -0
  12. data/config/benchmarks.rb +21 -0
  13. data/config/benchmarks.yml +2 -0
  14. data/images/empty.png +0 -0
  15. data/images/minus.png +0 -0
  16. data/images/plus.png +0 -0
  17. data/install.rb +70 -0
  18. data/latest_changes.txt +18 -0
  19. data/lib/benchmark.rb +576 -0
  20. data/lib/railsbench/benchmark.rb +576 -0
  21. data/lib/railsbench/benchmark_specs.rb +63 -0
  22. data/lib/railsbench/gc_info.rb +158 -0
  23. data/lib/railsbench/perf_info.rb +146 -0
  24. data/lib/railsbench/perf_utils.rb +202 -0
  25. data/lib/railsbench/railsbenchmark.rb +640 -0
  26. data/lib/railsbench/version.rb +9 -0
  27. data/lib/railsbench/write_headers_only.rb +15 -0
  28. data/postinstall.rb +12 -0
  29. data/ruby184gc.patch +516 -0
  30. data/ruby185gc.patch +562 -0
  31. data/ruby186gc.patch +564 -0
  32. data/ruby19gc.patch +2425 -0
  33. data/script/convert_raw_data_files +49 -0
  34. data/script/generate_benchmarks +171 -0
  35. data/script/perf_bench +74 -0
  36. data/script/perf_comp +151 -0
  37. data/script/perf_comp_gc +113 -0
  38. data/script/perf_diff +48 -0
  39. data/script/perf_diff_gc +53 -0
  40. data/script/perf_html +103 -0
  41. data/script/perf_plot +225 -0
  42. data/script/perf_plot_gc +254 -0
  43. data/script/perf_prof +87 -0
  44. data/script/perf_run +39 -0
  45. data/script/perf_run_gc +40 -0
  46. data/script/perf_table +104 -0
  47. data/script/perf_tex +58 -0
  48. data/script/perf_times +66 -0
  49. data/script/perf_times_gc +94 -0
  50. data/script/run_urls +57 -0
  51. data/setup.rb +1585 -0
  52. data/test/railsbench_test.rb +11 -0
  53. data/test/test_helper.rb +2 -0
  54. metadata +133 -0
@@ -0,0 +1,576 @@
1
+ =begin
2
+ #
3
+ # benchmark.rb - a performance benchmarking library
4
+ #
5
+ # $Id$
6
+ #
7
+ # Created by Gotoken (gotoken@notwork.org).
8
+ #
9
+ # Documentation by Gotoken (original RD), Lyle Johnson (RDoc conversion), and
10
+ # Gavin Sinclair (editing).
11
+ #
12
+ =end
13
+
14
+ # == Overview
15
+ #
16
+ # The Benchmark module provides methods for benchmarking Ruby code, giving
17
+ # detailed reports on the time taken for each task.
18
+ #
19
+
20
+ # The Benchmark module provides methods to measure and report the time
21
+ # used to execute Ruby code.
22
+ #
23
+ # * Measure the time to construct the string given by the expression
24
+ # <tt>"a"*1_000_000</tt>:
25
+ #
26
+ # require 'benchmark'
27
+ #
28
+ # puts Benchmark.measure { "a"*1_000_000 }
29
+ #
30
+ # On my machine (FreeBSD 3.2 on P5, 100MHz) this generates:
31
+ #
32
+ # 1.166667 0.050000 1.216667 ( 0.571355)
33
+ #
34
+ # This report shows the user CPU time, system CPU time, the sum of
35
+ # the user and system CPU times, and the elapsed real time. The unit
36
+ # of time is seconds.
37
+ #
38
+ # * Do some experiments sequentially using the #bm method:
39
+ #
40
+ # require 'benchmark'
41
+ #
42
+ # n = 50000
43
+ # Benchmark.bm do |x|
44
+ # x.report { for i in 1..n; a = "1"; end }
45
+ # x.report { n.times do ; a = "1"; end }
46
+ # x.report { 1.upto(n) do ; a = "1"; end }
47
+ # end
48
+ #
49
+ # The result:
50
+ #
51
+ # user system total real
52
+ # 1.033333 0.016667 1.016667 ( 0.492106)
53
+ # 1.483333 0.000000 1.483333 ( 0.694605)
54
+ # 1.516667 0.000000 1.516667 ( 0.711077)
55
+ #
56
+ # * Continuing the previous example, put a label in each report:
57
+ #
58
+ # require 'benchmark'
59
+ #
60
+ # n = 50000
61
+ # Benchmark.bm(7) do |x|
62
+ # x.report("for:") { for i in 1..n; a = "1"; end }
63
+ # x.report("times:") { n.times do ; a = "1"; end }
64
+ # x.report("upto:") { 1.upto(n) do ; a = "1"; end }
65
+ # end
66
+ #
67
+ # The result:
68
+ #
69
+ # user system total real
70
+ # for: 1.050000 0.000000 1.050000 ( 0.503462)
71
+ # times: 1.533333 0.016667 1.550000 ( 0.735473)
72
+ # upto: 1.500000 0.016667 1.516667 ( 0.711239)
73
+ #
74
+ #
75
+ # * The times for some benchmarks depend on the order in which items
76
+ # are run. These differences are due to the cost of memory
77
+ # allocation and garbage collection. To avoid these discrepancies,
78
+ # the #bmbm method is provided. For example, to compare ways to
79
+ # sort an array of floats:
80
+ #
81
+ # require 'benchmark'
82
+ #
83
+ # array = (1..1000000).map { rand }
84
+ #
85
+ # Benchmark.bmbm do |x|
86
+ # x.report("sort!") { array.dup.sort! }
87
+ # x.report("sort") { array.dup.sort }
88
+ # end
89
+ #
90
+ # The result:
91
+ #
92
+ # Rehearsal -----------------------------------------
93
+ # sort! 11.928000 0.010000 11.938000 ( 12.756000)
94
+ # sort 13.048000 0.020000 13.068000 ( 13.857000)
95
+ # ------------------------------- total: 25.006000sec
96
+ #
97
+ # user system total real
98
+ # sort! 12.959000 0.010000 12.969000 ( 13.793000)
99
+ # sort 12.007000 0.000000 12.007000 ( 12.791000)
100
+ #
101
+ #
102
+ # * Report statistics of sequential experiments with unique labels,
103
+ # using the #benchmark method:
104
+ #
105
+ # require 'benchmark'
106
+ #
107
+ # n = 50000
108
+ # Benchmark.benchmark(" "*7 + CAPTION, 7, FMTSTR, ">total:", ">avg:") do |x|
109
+ # tf = x.report("for:") { for i in 1..n; a = "1"; end }
110
+ # tt = x.report("times:") { n.times do ; a = "1"; end }
111
+ # tu = x.report("upto:") { 1.upto(n) do ; a = "1"; end }
112
+ # [tf+tt+tu, (tf+tt+tu)/3]
113
+ # end
114
+ #
115
+ # The result:
116
+ #
117
+ # user system total real
118
+ # for: 1.016667 0.016667 1.033333 ( 0.485749)
119
+ # times: 1.450000 0.016667 1.466667 ( 0.681367)
120
+ # upto: 1.533333 0.000000 1.533333 ( 0.722166)
121
+ # >total: 4.000000 0.033333 4.033333 ( 1.889282)
122
+ # >avg: 1.333333 0.011111 1.344444 ( 0.629761)
123
+
124
+ module Benchmark
125
+
126
+ BENCHMARK_VERSION = "2002-04-25" #:nodoc"
127
+
128
+ OUTPUT = STDOUT unless defined?(OUTPUT)
129
+ SYNC = true unless defined?(SYNC)
130
+
131
+ def Benchmark::times() # :nodoc:
132
+ Process::times()
133
+ end
134
+
135
+
136
+ # Invokes the block with a <tt>Benchmark::Report</tt> object, which
137
+ # may be used to collect and report on the results of individual
138
+ # benchmark tests. Reserves <i>label_width</i> leading spaces for
139
+ # labels on each line. Prints _caption_ at the top of the
140
+ # report, and uses _fmt_ to format each line.
141
+ # If the block returns an array of
142
+ # <tt>Benchmark::Tms</tt> objects, these will be used to format
143
+ # additional lines of output. If _label_ parameters are
144
+ # given, these are used to label these extra lines.
145
+ #
146
+ # _Note_: Other methods provide a simpler interface to this one, and are
147
+ # suitable for nearly all benchmarking requirements. See the examples in
148
+ # Benchmark, and the #bm and #bmbm methods.
149
+ #
150
+ # Example:
151
+ #
152
+ # require 'benchmark'
153
+ # include Benchmark # we need the CAPTION and FMTSTR constants
154
+ #
155
+ # n = 50000
156
+ # Benchmark.benchmark(" "*7 + CAPTION, 7, FMTSTR, ">total:", ">avg:") do |x|
157
+ # tf = x.report("for:") { for i in 1..n; a = "1"; end }
158
+ # tt = x.report("times:") { n.times do ; a = "1"; end }
159
+ # tu = x.report("upto:") { 1.upto(n) do ; a = "1"; end }
160
+ # [tf+tt+tu, (tf+tt+tu)/3]
161
+ # end
162
+ #
163
+ # <i>Generates:</i>
164
+ #
165
+ # user system total real
166
+ # for: 1.016667 0.016667 1.033333 ( 0.485749)
167
+ # times: 1.450000 0.016667 1.466667 ( 0.681367)
168
+ # upto: 1.533333 0.000000 1.533333 ( 0.722166)
169
+ # >total: 4.000000 0.033333 4.033333 ( 1.889282)
170
+ # >avg: 1.333333 0.011111 1.344444 ( 0.629761)
171
+ #
172
+
173
+ def benchmark(caption = "", label_width = nil, fmtstr = nil, *labels) # :yield: report
174
+ if SYNC
175
+ sync = OUTPUT.sync
176
+ OUTPUT.sync = true
177
+ end
178
+ label_width ||= 0
179
+ fmtstr ||= FMTSTR
180
+ raise ArgumentError, "no block" unless iterator?
181
+ OUTPUT.print caption
182
+ results = yield(Report.new(label_width, fmtstr))
183
+ Array === results and results.grep(Tms).each {|t|
184
+ OUTPUT.print((labels.shift || t.label || "").ljust(label_width),
185
+ t.format(fmtstr))
186
+ }
187
+ OUTPUT.sync = sync if SYNC
188
+ end
189
+
190
+
191
+ # A simple interface to the #benchmark method, #bm is generates sequential reports
192
+ # with labels. The parameters have the same meaning as for #benchmark.
193
+ #
194
+ # require 'benchmark'
195
+ #
196
+ # n = 50000
197
+ # Benchmark.bm(7) do |x|
198
+ # x.report("for:") { for i in 1..n; a = "1"; end }
199
+ # x.report("times:") { n.times do ; a = "1"; end }
200
+ # x.report("upto:") { 1.upto(n) do ; a = "1"; end }
201
+ # end
202
+ #
203
+ # <i>Generates:</i>
204
+ #
205
+ # user system total real
206
+ # for: 1.050000 0.000000 1.050000 ( 0.503462)
207
+ # times: 1.533333 0.016667 1.550000 ( 0.735473)
208
+ # upto: 1.500000 0.016667 1.516667 ( 0.711239)
209
+ #
210
+
211
+ def bm(label_width = 0, *labels, &blk) # :yield: report
212
+ benchmark(" "*label_width + CAPTION, label_width, FMTSTR, *labels, &blk)
213
+ end
214
+
215
+
216
+ # Sometimes benchmark results are skewed because code executed
217
+ # earlier encounters different garbage collection overheads than
218
+ # that run later. #bmbm attempts to minimize this effect by running
219
+ # the tests twice, the first time as a rehearsal in order to get the
220
+ # runtime environment stable, the second time for
221
+ # real. <tt>GC.start</tt> is executed before the start of each of
222
+ # the real timings; the cost of this is not included in the
223
+ # timings. In reality, though, there's only so much that #bmbm can
224
+ # do, and the results are not guaranteed to be isolated from garbage
225
+ # collection and other effects.
226
+ #
227
+ # Because #bmbm takes two passes through the tests, it can
228
+ # calculate the required label width.
229
+ #
230
+ # require 'benchmark'
231
+ #
232
+ # array = (1..1000000).map { rand }
233
+ #
234
+ # Benchmark.bmbm do |x|
235
+ # x.report("sort!") { array.dup.sort! }
236
+ # x.report("sort") { array.dup.sort }
237
+ # end
238
+ #
239
+ # <i>Generates:</i>
240
+ #
241
+ # Rehearsal -----------------------------------------
242
+ # sort! 11.928000 0.010000 11.938000 ( 12.756000)
243
+ # sort 13.048000 0.020000 13.068000 ( 13.857000)
244
+ # ------------------------------- total: 25.006000sec
245
+ #
246
+ # user system total real
247
+ # sort! 12.959000 0.010000 12.969000 ( 13.793000)
248
+ # sort 12.007000 0.000000 12.007000 ( 12.791000)
249
+ #
250
+ # #bmbm yields a Benchmark::Job object and returns an array of
251
+ # Benchmark::Tms objects.
252
+ #
253
+ def bmbm(width = 0, &blk) # :yield: job
254
+ job = Job.new(width)
255
+ yield(job)
256
+ width = job.width
257
+ if SYNC
258
+ sync = OUTPUT.sync
259
+ OUTPUT.sync = true
260
+ end
261
+
262
+ # rehearsal
263
+ OUTPUT.print "Rehearsal "
264
+ puts '-'*(width+CAPTION.length - "Rehearsal ".length)
265
+ list = []
266
+ job.list.each{|label,item|
267
+ OUTPUT.print(label.ljust(width))
268
+ res = Benchmark::measure(&item)
269
+ OUTPUT.print res.format()
270
+ list.push res
271
+ }
272
+ sum = Tms.new; list.each{|i| sum += i}
273
+ ets = sum.format("total: %tsec")
274
+ OUTPUT.printf("%s %s\n\n",
275
+ "-"*(width+CAPTION.length-ets.length-1), ets)
276
+
277
+ # take
278
+ OUTPUT.print ' '*width, CAPTION
279
+ list = []
280
+ ary = []
281
+ job.list.each{|label,item|
282
+ GC::start
283
+ OUTPUT.print label.ljust(width)
284
+ res = Benchmark::measure(&item)
285
+ OUTPUT.print res.format()
286
+ ary.push res
287
+ list.push [label, res]
288
+ }
289
+
290
+ OUTPUT.sync = sync if SYNC
291
+ ary
292
+ end
293
+
294
+ #
295
+ # Returns the time used to execute the given block as a
296
+ # Benchmark::Tms object.
297
+ #
298
+ def measure(label = "") # :yield:
299
+ t0, r0 = Benchmark.times, Time.now
300
+ yield
301
+ t1, r1 = Benchmark.times, Time.now
302
+ Benchmark::Tms.new(t1.utime - t0.utime,
303
+ t1.stime - t0.stime,
304
+ t1.cutime - t0.cutime,
305
+ t1.cstime - t0.cstime,
306
+ r1.to_f - r0.to_f,
307
+ label)
308
+ end
309
+
310
+ #
311
+ # Returns the elapsed real time used to execute the given block.
312
+ #
313
+ def realtime(&blk) # :yield:
314
+ Benchmark::measure(&blk).real
315
+ end
316
+
317
+
318
+
319
+ #
320
+ # A Job is a sequence of labelled blocks to be processed by the
321
+ # Benchmark.bmbm method. It is of little direct interest to the user.
322
+ #
323
+ class Job # :nodoc:
324
+ #
325
+ # Returns an initialized Job instance.
326
+ # Usually, one doesn't call this method directly, as new
327
+ # Job objects are created by the #bmbm method.
328
+ # _width_ is a initial value for the label offset used in formatting;
329
+ # the #bmbm method passes its _width_ argument to this constructor.
330
+ #
331
+ def initialize(width)
332
+ @width = width
333
+ @list = []
334
+ end
335
+
336
+ #
337
+ # Registers the given label and block pair in the job list.
338
+ #
339
+ def item(label = "", &blk) # :yield:
340
+ raise ArgmentError, "no block" unless block_given?
341
+ label.concat ' '
342
+ w = label.length
343
+ @width = w if @width < w
344
+ @list.push [label, blk]
345
+ self
346
+ end
347
+
348
+ alias report item
349
+
350
+ # An array of 2-element arrays, consisting of label and block pairs.
351
+ attr_reader :list
352
+
353
+ # Length of the widest label in the #list, plus one.
354
+ attr_reader :width
355
+ end
356
+
357
+ module_function :benchmark, :measure, :realtime, :bm, :bmbm
358
+
359
+
360
+
361
+ #
362
+ # This class is used by the Benchmark.benchmark and Benchmark.bm methods.
363
+ # It is of little direct interest to the user.
364
+ #
365
+ class Report # :nodoc:
366
+ #
367
+ # Returns an initialized Report instance.
368
+ # Usually, one doesn't call this method directly, as new
369
+ # Report objects are created by the #benchmark and #bm methods.
370
+ # _width_ and _fmtstr_ are the label offset and
371
+ # format string used by Tms#format.
372
+ #
373
+ def initialize(width = 0, fmtstr = nil)
374
+ @width, @fmtstr = width, fmtstr
375
+ end
376
+
377
+ #
378
+ # Prints the _label_ and measured time for the block,
379
+ # formatted by _fmt_. See Tms#format for the
380
+ # formatting rules.
381
+ #
382
+ def item(label = "", *fmt, &blk) # :yield:
383
+ OUTPUT.print label.ljust(@width)
384
+ res = Benchmark::measure(&blk)
385
+ OUTPUT.print res.format(@fmtstr, *fmt)
386
+ res
387
+ end
388
+
389
+ alias report item
390
+ end
391
+
392
+
393
+
394
+ #
395
+ # A data object, representing the times associated with a benchmark
396
+ # measurement.
397
+ #
398
+ class Tms
399
+ CAPTION = " user system total real\n"
400
+ FMTSTR = "%10.6u %10.6y %10.6t %10.6r\n"
401
+
402
+ # User CPU time
403
+ attr_reader :utime
404
+
405
+ # System CPU time
406
+ attr_reader :stime
407
+
408
+ # User CPU time of children
409
+ attr_reader :cutime
410
+
411
+ # System CPU time of children
412
+ attr_reader :cstime
413
+
414
+ # Elapsed real time
415
+ attr_reader :real
416
+
417
+ # Total time, that is _utime_ + _stime_ + _cutime_ + _cstime_
418
+ attr_reader :total
419
+
420
+ # Label
421
+ attr_reader :label
422
+
423
+ #
424
+ # Returns an initialized Tms object which has
425
+ # _u_ as the user CPU time, _s_ as the system CPU time,
426
+ # _cu_ as the children's user CPU time, _cs_ as the children's
427
+ # system CPU time, _real_ as the elapsed real time and _l_
428
+ # as the label.
429
+ #
430
+ def initialize(u = 0.0, s = 0.0, cu = 0.0, cs = 0.0, real = 0.0, l = nil)
431
+ @utime, @stime, @cutime, @cstime, @real, @label = u, s, cu, cs, real, l
432
+ @total = @utime + @stime + @cutime + @cstime
433
+ end
434
+
435
+ #
436
+ # Returns a new Tms object whose times are the sum of the times for this
437
+ # Tms object, plus the time required to execute the code block (_blk_).
438
+ #
439
+ def add(&blk) # :yield:
440
+ self + Benchmark::measure(&blk)
441
+ end
442
+
443
+ #
444
+ # An in-place version of #add.
445
+ #
446
+ def add!
447
+ t = Benchmark::measure(&blk)
448
+ @utime = utime + t.utime
449
+ @stime = stime + t.stime
450
+ @cutime = cutime + t.cutime
451
+ @cstime = cstime + t.cstime
452
+ @real = real + t.real
453
+ self
454
+ end
455
+
456
+ #
457
+ # Returns a new Tms object obtained by memberwise summation
458
+ # of the individual times for this Tms object with those of the other
459
+ # Tms object.
460
+ # This method and #/() are useful for taking statistics.
461
+ #
462
+ def +(other); memberwise(:+, other) end
463
+
464
+ #
465
+ # Returns a new Tms object obtained by memberwise subtraction
466
+ # of the individual times for the other Tms object from those of this
467
+ # Tms object.
468
+ #
469
+ def -(other); memberwise(:-, other) end
470
+
471
+ #
472
+ # Returns a new Tms object obtained by memberwise multiplication
473
+ # of the individual times for this Tms object by _x_.
474
+ #
475
+ def *(x); memberwise(:*, x) end
476
+
477
+ #
478
+ # Returns a new Tms object obtained by memberwise division
479
+ # of the individual times for this Tms object by _x_.
480
+ # This method and #+() are useful for taking statistics.
481
+ #
482
+ def /(x); memberwise(:/, x) end
483
+
484
+ #
485
+ # Returns the contents of this Tms object as
486
+ # a formatted string, according to a format string
487
+ # like that passed to Kernel.format. In addition, #format
488
+ # accepts the following extensions:
489
+ #
490
+ # <tt>%u</tt>:: Replaced by the user CPU time, as reported by Tms#utime.
491
+ # <tt>%y</tt>:: Replaced by the system CPU time, as reported by #stime (Mnemonic: y of "s*y*stem")
492
+ # <tt>%U</tt>:: Replaced by the children's user CPU time, as reported by Tms#cutime
493
+ # <tt>%Y</tt>:: Replaced by the children's system CPU time, as reported by Tms#cstime
494
+ # <tt>%t</tt>:: Replaced by the total CPU time, as reported by Tms#total
495
+ # <tt>%r</tt>:: Replaced by the elapsed real time, as reported by Tms#real
496
+ # <tt>%n</tt>:: Replaced by the label string, as reported by Tms#label (Mnemonic: n of "*n*ame")
497
+ #
498
+ # If _fmtstr_ is not given, FMTSTR is used as default value, detailing the
499
+ # user, system and real elapsed time.
500
+ #
501
+ def format(arg0 = nil, *args)
502
+ fmtstr = (arg0 || FMTSTR).dup
503
+ fmtstr.gsub!(/(%[-+\.\d]*)n/){"#{$1}s" % label}
504
+ fmtstr.gsub!(/(%[-+\.\d]*)u/){"#{$1}f" % utime}
505
+ fmtstr.gsub!(/(%[-+\.\d]*)y/){"#{$1}f" % stime}
506
+ fmtstr.gsub!(/(%[-+\.\d]*)U/){"#{$1}f" % cutime}
507
+ fmtstr.gsub!(/(%[-+\.\d]*)Y/){"#{$1}f" % cstime}
508
+ fmtstr.gsub!(/(%[-+\.\d]*)t/){"#{$1}f" % total}
509
+ fmtstr.gsub!(/(%[-+\.\d]*)r/){"(#{$1}f)" % real}
510
+ arg0 ? Kernel::format(fmtstr, *args) : fmtstr
511
+ end
512
+
513
+ #
514
+ # Same as #format.
515
+ #
516
+ def to_s
517
+ format
518
+ end
519
+
520
+ #
521
+ # Returns a new 6-element array, consisting of the
522
+ # label, user CPU time, system CPU time, children's
523
+ # user CPU time, children's system CPU time and elapsed
524
+ # real time.
525
+ #
526
+ def to_a
527
+ [@label, @utime, @stime, @cutime, @cstime, @real]
528
+ end
529
+
530
+ protected
531
+ def memberwise(op, x)
532
+ case x
533
+ when Benchmark::Tms
534
+ Benchmark::Tms.new(utime.__send__(op, x.utime),
535
+ stime.__send__(op, x.stime),
536
+ cutime.__send__(op, x.cutime),
537
+ cstime.__send__(op, x.cstime),
538
+ real.__send__(op, x.real)
539
+ )
540
+ else
541
+ Benchmark::Tms.new(utime.__send__(op, x),
542
+ stime.__send__(op, x),
543
+ cutime.__send__(op, x),
544
+ cstime.__send__(op, x),
545
+ real.__send__(op, x)
546
+ )
547
+ end
548
+ end
549
+ end
550
+
551
+ # The default caption string (heading above the output times).
552
+ CAPTION = Benchmark::Tms::CAPTION
553
+
554
+ # The default format string used to display times. See also Benchmark::Tms#format.
555
+ FMTSTR = Benchmark::Tms::FMTSTR
556
+ end
557
+
558
+ if __FILE__ == $0
559
+ include Benchmark
560
+
561
+ n = ARGV[0].to_i.nonzero? || 50000
562
+ puts %Q([#{n} times iterations of `a = "1"'])
563
+ benchmark(" " + CAPTION, 7, FMTSTR) do |x|
564
+ x.report("for:") {for i in 1..n; a = "1"; end} # Benchmark::measure
565
+ x.report("times:") {n.times do ; a = "1"; end}
566
+ x.report("upto:") {1.upto(n) do ; a = "1"; end}
567
+ end
568
+
569
+ benchmark do
570
+ [
571
+ measure{for i in 1..n; a = "1"; end}, # Benchmark::measure
572
+ measure{n.times do ; a = "1"; end},
573
+ measure{1.upto(n) do ; a = "1"; end}
574
+ ]
575
+ end
576
+ end