bullshit 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES ADDED
@@ -0,0 +1,8 @@
1
+ 2009-10-17 (0.1.1)
2
+ * Added the display of a speedup matrix in the comparison.
3
+ * Added a bs_compare executble in order to compare data files.
4
+ * A lot of smaller changes, esp. make comparing more robust by skipping
5
+ unavailable data files.
6
+ * throw_raise example added.
7
+ 2009-08-31 (0.1.0)
8
+ * Initial Release Version
data/README ADDED
@@ -0,0 +1,25 @@
1
+ = Bullshit - Benchmarking in Ruby
2
+
3
+ == Description
4
+
5
+ == Usage
6
+
7
+ == Example
8
+
9
+ TODO
10
+
11
+ == Download
12
+
13
+ The homepage of this library is located at
14
+
15
+ * http://flori.github.com/bullshit
16
+
17
+ == Author
18
+
19
+ Florian Frank mailto:flori@ping.de
20
+
21
+ == License
22
+
23
+ This is free software; you can redistribute it and/or modify it under the
24
+ terms of the GNU General Public License Version 2 as published by the Free
25
+ Software Foundation: www.gnu.org/copyleft/gpl.html
data/Rakefile CHANGED
@@ -33,41 +33,30 @@ task :doc do
33
33
  end
34
34
 
35
35
  if defined? Gem
36
- spec_src = <<GEM
37
- # -*- encoding: utf-8 -*-
38
- Gem::Specification.new do |s|
39
- s.name = '#{PKG_NAME}'
40
- s.version = '#{PKG_VERSION}'
41
- s.summary = "Benchmarking is Bullshit"
42
- s.description = ""
36
+ spec = Gem::Specification.new do |s|
37
+ s.name = PKG_NAME
38
+ s.version = PKG_VERSION
39
+ s.summary = "Benchmarking is Bullshit"
40
+ s.description = ""
43
41
 
44
- s.add_dependency('dslkit', '>= 0.2.5')
42
+ s.add_dependency('dslkit', '>= 0.2.5')
45
43
 
46
- s.files = #{PKG_FILES.to_a.sort.inspect}
44
+ s.files = PKG_FILES
47
45
 
48
- s.require_path = 'lib'
46
+ s.require_path = 'lib'
47
+ s.executables = 'bs_compare'
49
48
 
50
- s.has_rdoc = true
51
- s.rdoc_options <<
52
- '--title' << 'Bullshit -- Benchmarking in Ruby' <<
53
- '--line-numbers'
54
- s.test_files = #{Dir['tests/*.rb'].to_a.sort.inspect}
49
+ s.has_rdoc = true
50
+ s.rdoc_options <<
51
+ '--title' << 'Bullshit -- Benchmarking in Ruby' << '--main' << 'README'
52
+ s.test_files = Dir['tests/*.rb']
55
53
 
56
- s.author = "Florian Frank"
57
- s.email = "flori@ping.de"
58
- s.homepage = "http://#{PKG_NAME}.rubyforge.org"
59
- s.rubyforge_project = "#{PKG_NAME}"
60
- end
61
- GEM
62
-
63
- desc 'Create a gemspec file'
64
- task :gemspec do
65
- File.open("#{PKG_NAME}.gemspec", 'w') do |f|
66
- f.puts spec_src
67
- end
54
+ s.author = "Florian Frank"
55
+ s.email = "flori@ping.de"
56
+ s.homepage = "http://flori.github.com/#{PKG_NAME}"
57
+ s.rubyforge_project = PKG_NAME
68
58
  end
69
59
 
70
- spec = eval(spec_src)
71
60
  Rake::GemPackageTask.new(spec) do |pkg|
72
61
  pkg.need_tar = true
73
62
  pkg.package_files += PKG_FILES
@@ -91,6 +80,6 @@ EOT
91
80
  end
92
81
  end
93
82
 
94
- task :default => [ :version, :gemspec, :test ]
83
+ task :default => [ :version, :test ]
95
84
 
96
- task :release => [ :clobber, :version, :gemspec, :package ]
85
+ task :release => [ :clobber, :version, :package ]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.1.1
data/bin/bs_compare ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bullshit'
4
+ Bullshit::Case.autorun false
5
+
6
+ bs_cases_methods = []
7
+ for filename in ARGV
8
+ if filename =~ /\.rb\Z/
9
+ warn "Loading #{filename}."
10
+ load filename
11
+ next
12
+ end
13
+ basename = File.basename(filename)
14
+ basename =~ /\A([^-]+)#([^-]+)\.dat\Z/ or next
15
+ bs_cases_methods << [ $1, $2, filename ]
16
+ end
17
+ Bullshit.compare do
18
+ bs_cases_methods.each do |c, m, f|
19
+ benchmark Object.const_get(c), m.to_sym, :load => f
20
+ end
21
+ end
data/examples/compare.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'bullshit'
4
- require File.join(File.dirname(__FILE__), 'fibonacci')
4
+ load File.join(File.dirname(__FILE__), 'fibonacci.rb')
5
5
 
6
- FibonacciBenchmark.run # to demonstrate loading
6
+ FibonacciBenchmark.run false # to demonstrate loading, do not compare yet
7
7
 
8
8
  Bullshit.compare do
9
9
  benchmark FibonacciBenchmark, :fib_iter, :load => yes
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bullshit'
4
+
5
+ class ThrowRaise < Bullshit::RepeatCase
6
+ compare_time real
7
+ warmup yes
8
+ iterations 100
9
+
10
+ N = 2_000
11
+
12
+ autocorrelation yes
13
+
14
+ output_dir 'data'
15
+ data_file yes
16
+
17
+ #output_filename "#{benchmark_name}.log"
18
+
19
+ def benchmark_throw
20
+ N.times do
21
+ catch(:foo) do
22
+ throw :foo
23
+ end
24
+ end
25
+ end
26
+
27
+ def benchmark_raise
28
+ N.times do
29
+ begin
30
+ raise 'foo'
31
+ rescue
32
+ end
33
+ end
34
+ end
35
+ end
data/lib/bullshit.rb CHANGED
@@ -1,32 +1,3 @@
1
- # = Bullshit - Benchmarking in Ruby
2
- #
3
- # == Description
4
- #
5
- # == Usage
6
- #
7
- # == Author
8
- #
9
- # Florian Frank mailto:flori@ping.de
10
- #
11
- # == License
12
- #
13
- # This is free software; you can redistribute it and/or modify it under the
14
- # terms of the GNU General Public License Version 2 as published by the Free
15
- # Software Foundation: www.gnu.org/copyleft/gpl.html
16
- #
17
- # == Download
18
- #
19
- # The latest version of this library can be downloaded at
20
- #
21
- # * http://rubyforge.org/frs/?group_id=8323
22
- #
23
- # The homepage of this library is located at
24
- #
25
- # * http://bullshit.rubyforge.org
26
- #
27
- # == Example
28
- #
29
-
30
1
  require 'dslkit'
31
2
  require 'enumerator'
32
3
 
@@ -463,6 +434,11 @@ module Bullshit
463
434
  define_method(time) { analysis[time].sum }
464
435
  end
465
436
 
437
+ # Returns the sum of measurement times for +time+.
438
+ def sum(time)
439
+ __send__ time
440
+ end
441
+
466
442
  # Seconds per call (mean)
467
443
  def call_time_mean
468
444
  mean(self.case.compare_time)
@@ -1301,11 +1277,11 @@ module Bullshit
1301
1277
  # This method tries to detect autocorrelation with the Ljung-Box
1302
1278
  # statistic. If enough lags can be considered it returns a hash with
1303
1279
  # results, otherwise nil is returned. The keys are
1304
- # :lags: the number of lags,
1305
- # :alpha_level: the alpha level for the test,
1306
- # :q: the value of the ljung_box_statistic,
1307
- # :p: the p-value computed, if p is higher than alpha no correlation was detected,
1308
- # :detected: true if a correlation was found.
1280
+ # :lags:: the number of lags,
1281
+ # :alpha_level:: the alpha level for the test,
1282
+ # :q:: the value of the ljung_box_statistic,
1283
+ # :p:: the p-value computed, if p is higher than alpha no correlation was detected,
1284
+ # :detected:: true if a correlation was found.
1309
1285
  def detect_autocorrelation(lags = 20, alpha_level = 0.05)
1310
1286
  if q = ljung_box_statistic(lags)
1311
1287
  p = ChiSquareDistribution.new(lags).probability(q)
@@ -1446,7 +1422,10 @@ module Bullshit
1446
1422
  end
1447
1423
  end
1448
1424
  self
1425
+ rescue Errno::ENOENT
1449
1426
  end
1427
+
1428
+ alias to_s long_name
1450
1429
  end
1451
1430
 
1452
1431
  module CommonConstants
@@ -1489,6 +1468,8 @@ module Bullshit
1489
1468
 
1490
1469
  dsl_accessor :batch_size, 1
1491
1470
 
1471
+ dsl_accessor :comparison, true
1472
+
1492
1473
  class TruncateData
1493
1474
  extend DSLKit::DSLAccessor
1494
1475
  extend DSLKit::Constant
@@ -1507,8 +1488,8 @@ module Bullshit
1507
1488
  def initialize(enable, &block)
1508
1489
  if block
1509
1490
  enable.nil? or raise ArgumentError, "block form doesn't take an argument"
1510
- instance_eval(&block)
1511
1491
  enabled true
1492
+ instance_eval(&block)
1512
1493
  else
1513
1494
  enabled enable.nil? ? false : enable
1514
1495
  end
@@ -1556,8 +1537,8 @@ module Bullshit
1556
1537
  def initialize(enable = nil, &block)
1557
1538
  if block
1558
1539
  enable.nil? or raise ArgumentError, "block form doesn't take an argument"
1559
- instance_eval(&block)
1560
1540
  enabled true
1541
+ instance_eval(&block)
1561
1542
  else
1562
1543
  enabled enable.nil? ? true : enable
1563
1544
  end
@@ -1658,8 +1639,10 @@ module Bullshit
1658
1639
  # measure their running time.
1659
1640
  def initialize
1660
1641
  @clocks = []
1661
- @comparison = Comparison.new
1662
- @comparison.output self.class.output
1642
+ if self.class.comparison
1643
+ @comparison = Comparison.new
1644
+ @comparison.output self.class.output
1645
+ end
1663
1646
  end
1664
1647
 
1665
1648
  # Return the name of the benchmark case as a string.
@@ -1769,7 +1752,9 @@ module Bullshit
1769
1752
  self.class.output.puts evaluation(clock)
1770
1753
  end
1771
1754
  @clocks << clock
1772
- @comparison.benchmark(self, bc_method.short_name, :run => false)
1755
+ if @comparison
1756
+ @comparison.benchmark(self, bc_method.short_name, :run => false)
1757
+ end
1773
1758
  end
1774
1759
  @clocks
1775
1760
  end
@@ -1779,12 +1764,12 @@ module Bullshit
1779
1764
 
1780
1765
  # Setup, run all benchmark cases (warmup and the real run) and output
1781
1766
  # results, run method speed comparisons, and teardown.
1782
- def run(comparison = true)
1767
+ def run(do_compare = true)
1783
1768
  old_sync, self.class.output.sync = self.class.output.sync, true
1784
1769
  $DEBUG and warn "Calling setup."
1785
1770
  setup
1786
1771
  run_once
1787
- comparison and @comparison.display
1772
+ do_compare and @comparison and @comparison.display
1788
1773
  self
1789
1774
  rescue => e
1790
1775
  warn "Caught #{e.class}: #{e}\n\n#{e.backtrace.map { |x| "\t#{x}\n" }}"
@@ -1796,8 +1781,8 @@ module Bullshit
1796
1781
  end
1797
1782
 
1798
1783
  # Creates an instance of this class and run it.
1799
- def self.run
1800
- new.run
1784
+ def self.run(do_compare = true)
1785
+ new.run do_compare
1801
1786
  end
1802
1787
 
1803
1788
  # Write all output files after run.
@@ -1880,7 +1865,7 @@ module Bullshit
1880
1865
  module EvaluationModule
1881
1866
  def statistics_table(clock)
1882
1867
  result = ' ' * NAME_COLUMN_SIZE << ('%17s ' * 4) % times << "\n"
1883
- result << evaluation_line('sum', times.map { |t| clock.__send__(t) })
1868
+ result << evaluation_line('sum', times.map { |t| clock.sum(t) })
1884
1869
  result << evaluation_line('min', times.map { |t| clock.min(t) })
1885
1870
  result << evaluation_line('std-', times.map { |t| clock.arithmetic_mean(t) - clock.sample_standard_deviation(t) })
1886
1871
  result << evaluation_line('mean', times.map { |t| clock.arithmetic_mean(t) })
@@ -2127,7 +2112,7 @@ module Bullshit
2127
2112
  def benchmark(bc_class, method, opts = {})
2128
2113
  opts = { :run => true, :combine => true }.merge opts
2129
2114
  if Case === bc_class
2130
- bullshit_case, bc_class = bc_class, bullshit_case.class
2115
+ bullshit_case, bc_class = bc_class, bc_class.class
2131
2116
  @cases[bc_class] ||= []
2132
2117
  if opts[:combine]
2133
2118
  if @cases[bc_class].empty?
@@ -2155,15 +2140,20 @@ module Bullshit
2155
2140
  if comment = opts[:comment]
2156
2141
  bc_method.comment = comment
2157
2142
  end
2158
- @benchmark_methods << bc_method
2159
2143
  if file_path = opts[:load]
2160
- if file_path != true
2161
- bc_method.load file_path
2144
+ success = if file_path != true
2145
+ bc_method.load(file_path)
2162
2146
  else
2163
2147
  bc_method.load
2164
2148
  end
2149
+ if success
2150
+ @benchmark_methods << bc_method
2151
+ else
2152
+ warn "Loading of #{bc_method} failed. Skipping to next."
2153
+ end
2165
2154
  else
2166
2155
  opts[:run] and bullshit_case.run false
2156
+ @benchmark_methods << bc_method
2167
2157
  end
2168
2158
  nil
2169
2159
  end
@@ -2193,43 +2183,68 @@ module Bullshit
2193
2183
  output.puts Time.now.strftime(' %FT%T %Z ').center(COLUMNS, '=')
2194
2184
  for comparator in [ :call_time_mean, :call_time_median ]
2195
2185
  output.puts
2196
- methods = compare_methods(comparator)
2197
- methods.size < 2 and return
2198
- max = methods.last.clock.__send__(comparator)
2186
+ cmethods = compare_methods(comparator)
2187
+ cmethods.size < 2 and return
2188
+ max = cmethods.last.clock.__send__(comparator)
2199
2189
  output.puts "Comparing times (#{comparator}):"
2200
- methods.each_with_index do |m, i|
2201
- covers = []
2202
- for x in methods
2203
- if m != x and m.cover?(x)
2204
- j = 0
2205
- if methods.find { |y| j += 1; x == y }
2206
- my_case = m.case.class
2207
- iterations = m.clock.analysis[my_case.compare_time].suggested_sample_size(
2208
- x.clock.analysis[my_case.compare_time], my_case.covering.alpha_level, my_case.covering.beta_level)
2209
- if iterations.nan? or iterations.infinite?
2210
- covers << "#{j} (?)"
2211
- else
2212
- min_iterations = iterations.ceil
2213
- min_iterations >= 1E6 and min_iterations = "%f" % (1 / 0.0)
2214
- covers << "#{j} (>=#{min_iterations})"
2215
- end
2216
- end
2217
- end
2218
- end
2219
- covers *= ', '
2190
+ cmethods.each_with_index do |m, i|
2220
2191
  output.printf\
2221
2192
  "% 2u #{prefix_string(m)}\n %17.9f"\
2222
- " (%#{::Bullshit::Clock::TIMES_MAX}s) -> %8.3fx %s\n"\
2223
- " %17.9f\n",
2193
+ " (%#{::Bullshit::Clock::TIMES_MAX}s) %s\n"\
2194
+ " %17.9f %8.2f %17.9f\n",
2224
2195
  i + 1, m.clock.calls(comparator), m.case.class.compare_time,
2225
- max / m.clock.__send__(comparator), covers, m.clock.__send__(comparator)
2196
+ compute_covers(cmethods, m), m.clock.__send__(comparator),
2197
+ m.clock.sample_standard_deviation_percentage(m.case.class.compare_time),
2198
+ m.clock.sum(m.case.class.compare_time)
2226
2199
  end
2227
- output.puts " %17s (%#{::Bullshit::Clock::TIMES_MAX}s) -> %8s %s\n"\
2228
- " %17s\n"\
2229
- % %w[calls/sec time speed covers secs/call]
2200
+ output.puts " %17s (%#{::Bullshit::Clock::TIMES_MAX}s) %s\n"\
2201
+ " %17s %8s %17s\n"\
2202
+ % %w[calls/sec time covers secs/call std% sum]
2203
+ display_speedup_matrix(cmethods, comparator)
2230
2204
  end
2231
2205
  output.puts '=' * COLUMNS
2232
2206
  end
2207
+
2208
+ private
2209
+
2210
+ def display_speedup_matrix(cmethods, comparator)
2211
+ output.print "\n", " " * 3
2212
+ cmethods.size.times do |i|
2213
+ output.printf "%7d ", i + 1
2214
+ end
2215
+ output.puts
2216
+ cmethods.each_with_index do |x, i|
2217
+ output.printf "%2d ", i + 1
2218
+ cmethods.each do |y|
2219
+ ratio = x.clock.calls(comparator).to_f / y.clock.calls(comparator)
2220
+ ratio /= 0.0 if ratio >= 1000
2221
+ output.printf "%7.2f ", ratio
2222
+ end
2223
+ output.puts
2224
+ end
2225
+ end
2226
+
2227
+ def compute_covers(cmethods, m)
2228
+ covers = []
2229
+ for x in cmethods
2230
+ if m != x and m.cover?(x)
2231
+ j = 0
2232
+ if cmethods.find { |y| j += 1; x == y }
2233
+ my_case = m.case.class
2234
+ iterations = m.clock.analysis[my_case.compare_time].suggested_sample_size(
2235
+ x.clock.analysis[my_case.compare_time], my_case.covering.alpha_level, my_case.covering.beta_level)
2236
+ if iterations.nan? or iterations.infinite?
2237
+ covers << "#{j} (?)"
2238
+ else
2239
+ min_iterations = iterations.ceil
2240
+ min_iterations >= 1E6 and min_iterations = "%f" % (1 / 0.0)
2241
+ covers << "#{j} (>=#{min_iterations})"
2242
+ end
2243
+ end
2244
+ end
2245
+ end
2246
+ covers * ', '
2247
+ end
2233
2248
  end
2234
2249
 
2235
2250
  # Create a Comparison instance configured by +block+ and compute and display
@@ -1,6 +1,6 @@
1
1
  module Bullshit
2
2
  # Bullshit version
3
- VERSION = '0.1.0'
3
+ VERSION = '0.1.1'
4
4
  VERSION_ARRAY = VERSION.split(/\./).map { |x| x.to_i } # :nodoc:
5
5
  VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
6
  VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
data/make_doc.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  puts "Creating documentation."
4
- system "rdoc -S -d #{Dir['lib/**/*.rb'] * ' '}"
4
+ system "rdoc --main README --title 'Bullshit -- Benchmarking in Ruby'"\
5
+ " -d #{Dir['lib/**/*.rb'] * ' '}"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bullshit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Frank
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-08-31 00:00:00 +02:00
12
+ date: 2009-11-18 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -24,45 +24,46 @@ dependencies:
24
24
  version:
25
25
  description: ""
26
26
  email: flori@ping.de
27
- executables: []
28
-
27
+ executables:
28
+ - bs_compare
29
29
  extensions: []
30
30
 
31
31
  extra_rdoc_files: []
32
32
 
33
33
  files:
34
- - COPYING
35
- - Rakefile
34
+ - CHANGES
35
+ - bin/bs_compare
36
36
  - VERSION
37
- - bullshit.gemspec
38
- - data
39
- - examples
40
- - examples/compare.rb
41
- - examples/fibonacci.rb
37
+ - README
38
+ - make_doc.rb
39
+ - Rakefile
40
+ - examples/throw_raise.rb
42
41
  - examples/iteration.rb
43
42
  - examples/josephus.rb
43
+ - examples/fibonacci.rb
44
+ - examples/compare.rb
44
45
  - examples/sorting.rb
45
- - install.rb
46
- - lib
47
- - lib/bullshit
48
- - lib/bullshit.rb
49
46
  - lib/bullshit/version.rb
50
- - make_doc.rb
51
- - tests
47
+ - lib/bullshit.rb
48
+ - tests/test_continued_fraction.rb
49
+ - tests/test_window.rb
50
+ - tests/test_functions.rb
52
51
  - tests/test_analysis.rb
53
52
  - tests/test_bullshit.rb
54
- - tests/test_continued_fraction.rb
55
53
  - tests/test_distribution.rb
56
- - tests/test_functions.rb
57
54
  - tests/test_newton_bisection.rb
58
- - tests/test_window.rb
55
+ - COPYING
56
+ - install.rb
59
57
  has_rdoc: true
60
- homepage: http://bullshit.rubyforge.org
58
+ homepage: http://flori.github.com/bullshit
59
+ licenses: []
60
+
61
61
  post_install_message:
62
62
  rdoc_options:
63
63
  - --title
64
64
  - Bullshit -- Benchmarking in Ruby
65
- - --line-numbers
65
+ - --main
66
+ - README
66
67
  require_paths:
67
68
  - lib
68
69
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -80,15 +81,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
80
81
  requirements: []
81
82
 
82
83
  rubyforge_project: bullshit
83
- rubygems_version: 1.3.1
84
+ rubygems_version: 1.3.5
84
85
  signing_key:
85
- specification_version: 2
86
+ specification_version: 3
86
87
  summary: Benchmarking is Bullshit
87
88
  test_files:
89
+ - tests/test_continued_fraction.rb
90
+ - tests/test_window.rb
91
+ - tests/test_functions.rb
88
92
  - tests/test_analysis.rb
89
93
  - tests/test_bullshit.rb
90
- - tests/test_continued_fraction.rb
91
94
  - tests/test_distribution.rb
92
- - tests/test_functions.rb
93
95
  - tests/test_newton_bisection.rb
94
- - tests/test_window.rb
data/bullshit.gemspec DELETED
@@ -1,24 +0,0 @@
1
- # -*- encoding: utf-8 -*-
2
- Gem::Specification.new do |s|
3
- s.name = 'bullshit'
4
- s.version = '0.1.0'
5
- s.summary = "Benchmarking is Bullshit"
6
- s.description = ""
7
-
8
- s.add_dependency('dslkit', '>= 0.2.5')
9
-
10
- s.files = ["COPYING", "Rakefile", "VERSION", "bullshit.gemspec", "data", "examples", "examples/compare.rb", "examples/fibonacci.rb", "examples/iteration.rb", "examples/josephus.rb", "examples/sorting.rb", "install.rb", "lib", "lib/bullshit", "lib/bullshit.rb", "lib/bullshit/version.rb", "make_doc.rb", "tests", "tests/test_analysis.rb", "tests/test_bullshit.rb", "tests/test_continued_fraction.rb", "tests/test_distribution.rb", "tests/test_functions.rb", "tests/test_newton_bisection.rb", "tests/test_window.rb"]
11
-
12
- s.require_path = 'lib'
13
-
14
- s.has_rdoc = true
15
- s.rdoc_options <<
16
- '--title' << 'Bullshit -- Benchmarking in Ruby' <<
17
- '--line-numbers'
18
- s.test_files = ["tests/test_analysis.rb", "tests/test_bullshit.rb", "tests/test_continued_fraction.rb", "tests/test_distribution.rb", "tests/test_functions.rb", "tests/test_newton_bisection.rb", "tests/test_window.rb"]
19
-
20
- s.author = "Florian Frank"
21
- s.email = "flori@ping.de"
22
- s.homepage = "http://bullshit.rubyforge.org"
23
- s.rubyforge_project = "bullshit"
24
- end