using:
Please note that these are mostly synthetic benchmarks!
| Benchmark | old | new | (in seconds) |
| app_answer | 0.58 | 0.15 | 4.0x (-75 %) |
| app_erb | 2.19 | 2.05 | 1.1x (-6 %) |
| app_factorial | [Ruby 1.8.6 broken (stack level too deep)] | ||
| app_fib | 7.51 | 1.98 | 3.8x (-74 %) |
| app_mandelbrot | 2.44 | 1.10 | 2.2x (-55 %) |
| app_pentomino | 107.94 | 59.81 | 1.8x (-45 %) |
| app_raise | 2.49 | 2.84 | 0.9x (+14 %) |
| app_strconcat | 1.80 | 1.18 | 1.5x (-35 %) |
| app_tak | 9.66 | 2.72 | 3.6x (-72 %) |
| app_tarai | 7.74 | 2.14 | 3.6x (-72 %) |
| app_uri | 4.67 | 2.60 | 1.8x (-44 %) |
| io_file_create | 1.85 | 2.42 | 0.8x (+30 %) |
| io_file_read | 1.16 | 1.93 | 0.6x (+67 %) |
| io_file_write | 0.80 | 0.68 | 1.2x (-15 %) |
| interpreter_launch | 0.01 | 0.04 | 0.3x (+207 %) |
| loop_generator | 24.57 | 1.78 | 13.8x (-93 %) |
| loop_times | 5.90 | 4.46 | 1.3x (-24 %) |
| loop_whileloop | 10.41 | 1.91 | 5.5x (-82 %) |
| loop_whileloop2 | 2.08 | 0.38 | 5.5x (-82 %) |
| so_ackermann | [Ruby 1.8.6 broken (stack level too deep)] | ||
| so_array | 7.75 | 4.51 | 1.7x (-42 %) |
| so_binary_trees | 3.34 | 1.56 | 2.1x (-53 %) |
| so_concatenate | 2.19 | 1.33 | 1.7x (-39 %) |
| so_count_words | 1.55 | 8.42 | 0.2x (+442 %) |
| so_exception | 4.24 | 4.02 | 1.1x (-5 %) |
| so_fannkuch | 78.69 | 60.23 | 1.3x (-23 %) |
| so_fasta | 10.76 | 7.41 | 1.5x (-31 %) |
| so_k_nucleotide | 6.20 | 5.74 | 1.1x (-8 %) |
| so_lists | 1.35 | 1.10 | 1.2x (-18 %) |
| so_mandelbrot | 33.01 | 19.18 | 1.7x (-42 %) |
| so_matrix | 2.30 | 1.23 | 1.9x (-46 %) |
| so_meteor_contest | 37.34 | 23.41 | 1.6x (-37 %) |
| so_nbody | 23.98 | 12.72 | 1.9x (-47 %) |
| so_nested_loop | 6.05 | 3.96 | 1.5x (-35 %) |
| so_nsieve | 23.45 | 8.46 | 2.8x (-64 %) |
| so_nsieve_bits | 52.25 | 10.41 | 5.0x (-80 %) |
| so_object | 7.02 | 2.72 | 2.6x (-61 %) |
| so_partial_sums | 27.29 | 13.36 | 2.0x (-51 %) |
| so_pidigits | 5.96 | 7.02 | 0.8x (+18 %) |
| so_random | 2.22 | 0.79 | 2.8x (-64 %) |
| so_reverse_complement | 3.89 | 4.52 | 0.9x (+16 %) |
| so_sieve | 0.69 | 0.23 | 3.1x (-67 %) |
| so_spectralnorm | 28.18 | 14.62 | 1.9x (-48 %) |
| vm1_block | 16.04 | 5.50 | 2.9x (-66 %) |
| vm1_const | 6.75 | 0.90 | 7.5x (-87 %) |
| vm1_ensure | 7.16 | 0.04 | 183.6x (-99 %) |
| vm1_ivar | 6.56 | 4.13 | 1.6x (-37 %) |
| vm1_ivar_set | 6.83 | 4.63 | 1.5x (-32 %) |
| vm1_length | 9.99 | 2.97 | 3.4x (-70 %) |
| vm1_neq | 8.23 | 1.57 | 5.2x (-81 %) |
| vm1_not | 2.48 | 0.72 | 3.4x (-71 %) |
| vm1_rescue | 3.49 | 0.23 | 14.9x (-93 %) |
| vm1_simplereturn | 11.95 | 3.23 | 3.7x (-73 %) |
| vm1_swap | 15.26 | 0.74 | 20.7x (-95 %) |
| vm2_array | 3.88 | 2.88 | 1.3x (-26 %) |
| vm2_case | 2.86 | 0.42 | 6.8x (-85 %) |
| vm2_eval | 13.59 | 58.71 | 0.2x (+332 %) |
| vm2_method | 11.16 | 4.98 | 2.2x (-55 %) |
| vm2_mutex | 3.34 | 3.83 | 0.9x (+15 %) |
| vm2_poly_method | 15.18 | 6.59 | 2.3x (-57 %) |
| vm2_poly_method_ov | 2.63 | 0.65 | 4.1x (-75 %) |
| vm2_proc | 5.47 | 1.99 | 2.7x (-64 %) |
| vm2_regexp | 3.00 | 3.79 | 0.8x (+26 %) |
| vm2_send | 2.42 | 0.73 | 3.3x (-70 %) |
| vm2_super | 3.11 | 1.29 | 2.4x (-59 %) |
| vm2_unif1 | 2.06 | 0.68 | 3.0x (-67 %) |
| vm2_zsuper | 3.67 | 1.34 | 2.7x (-63 %) |
| vm3_thread_create_join | 0.53 | 5.13 | 0.1x (+864 %) |
| vm3_thread_mutex | 78.38 | 46.37 | 1.7x (-41 %) |
| lib_coderay | 3.12 | 3.13 | 1.0x (+1 %) |
| lib_json_pure | 0.37 | 0.28 | 1.3x (-24 %) |
| lib_rdoc_coderay | 4.29 | 6.02 | 0.7x (+40 %) |
| interpreter_start | 0.01 | 0.02 | 0.3x (+186 %) |
| interpreter_require | 0.05 | 0.11 | 0.5x (+107 %) |
* means that results of loop_whileloop/loop_whileloop2 are subtracted.
| group | # | speedup |
| Core (vm) | 26 | 10.9x |
| Loops (loop) | 4 | 6.5x |
| Mini apps (app) | 10 | 2.4x |
| Shootout (so) | 23 | 1.8x |
| Libraries (lib) | 3 | 1.0x |
| I/O (io) | 3 | 0.8x |
| Interpreter (interpreter) | 3 | 0.4x |
require 'cgi'
puts <<-HEAD
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" version="-//W3C//DTD XHTML 1.1//EN" xml:lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Ruby 1.8 vs. 1.9 Benchmarks</title>
<style type="text/css" media="screen">
html { font-family: 'Trebuchet MS', Verdana, Arial, sans-serif; }
td {
vertical-align: middle;
white-space: nowrap;
padding: 0.1em 0.3em;
text-align: left;
border: 1px solid black; border-width: 1px 0;
}
table {
border-collapse: collapse;
margin: 0;
}
table h6 {
margin: 0.1em; padding: 0.1em 0.3em;
white-space: nowrap;
font-size: 0.7em;
}
thead td { border-top-width: 0; }
.faster { background-color: #2f2; }
.slower { background-color: #f22; }
.broken { background-color: silver; }
.time { font-size: 0.9em; }
.right { text-align: right; }
.note { color: red; font-weight: bold; }
dd { font-style: italic; }
</style>
</head>
<body>
<h1>Benchmarks: Ruby 1.8 and Ruby 1.9</h1>
<p>using:</p>
<dl>
<dt>Old</dt>
<dd>Ruby 1.8.6 / Patchlevel 113 (2007-12-03)</dd>
<dt>New</dt>
<dd>Ruby 1.9.0 / Revision 15006 (2008-01-12)</dd>
<dt>System</dt>
<dd>Mac OS X 10.5.1 on First Generation MacBook (1.83GHz Intel Core Duo, 2GB 667 MHz DDR2 SDRAM)</dd>
</dl>
<p class="note">
Please note that these are mostly synthetic benchmarks!
</p>
<table>
<thead>
<tr>
<td class="benchmark">Benchmark</td>
<td class="time right">old</td>
<td class="time right">new</td>
<td class="time">(in seconds)</td>
</tr>
</thead>
<tbody>
HEAD
WIDTH_FACTOR = 500
MAX_WIDTH = WIDTH_FACTOR
EXPLAIN = {
'app' => 'Mini apps',
'so' => 'Shootout',
'lib' => 'Libraries',
'vm' => 'Core',
'loop' => 'Loops',
'io' => 'I/O',
'other' => 'Other',
'interpreter' => 'Interpreter',
}
speedups_for = Hash.new { |h, k| h[k] = [] }
looptime = Hash.new([0, 0])
DATA.read.scan(/^ *(\w+)\*?\s+(\S+)\s+(\S+) *(.+)?/) do |name, old, new, broken|
if broken
puts "<tr class=\"broken\">"
puts "<td class=\"benchmark\">%s</td>" % [name] + "<td></td>" * 2 + "<td>[#{$4}]</td>"
puts "</tr>"
next
end
old = old.to_f
new = new.to_f
case name
when /^loop_whileloop(2)?$/
looptime[$1 || '1'] = [old, new]
when false #/^vm([12])/
offset_old, offset_new = looptime[$1]
new -= offset_new
old -= offset_old
name << '*'
end
# build HTML table
puts "<tr>"
puts '<td class="benchmark">%s</td>' % name
puts '<td class="time right">%0.2f</td><td class="time right">%0.2f</td>' %
[old, new]
width = [WIDTH_FACTOR * ((new / old) - 1).abs, MAX_WIDTH].min
puts '<td><h6 style="width: %dpx" class="%s">%0.1fx (%+0.0f %%)</h6></td>' % [
width,
(new <= old ? 'faster' : 'slower'),
(old / new),
100 * ((new / old) - 1)
]
puts "</tr>"
speedup = (old / new)
if name[/^(app|loop|so|vm|lib|io|interpreter)/]
speedups_for[$1] << speedup
else
speedups_for['other'] << speedup
end
end
puts "</tbody></table>"
puts "<p><small>* means that results of loop_whileloop/loop_whileloop2 are subtracted.</small></p>"
puts <<-HTML
<table>
<thead>
<tr>
<td class="benchmark">group</td>
<td class="right">#</td>
<td class="right">speedup</td>
</tr>
</thead>
<tbody>
HTML
speedups_for.map do |tag, speedups|
average_speedup = speedups.inject { |sum,x| sum + x } / speedups.size
[average_speedup, tag, speedups]
end.sort.reverse.each do |average_speedup, tag, speedups|
puts "<tr><td>#{EXPLAIN[tag]} (#{tag})</td><td class=\"right\">%d</td>" % [speedups.size]
puts "<td class=\"right\">%0.1fx</td></tr>" % [average_speedup]
end
puts "</tbody></table>"
puts <<-BODY
<h3>Sourcecode</h3>
<pre>#{DATA.rewind; CGI.escapeHTML(DATA.read)}</pre>
</body>
</html>
BODY
__END__
app_answer 0.579 0.146
app_erb 2.190 2.053
app_factorial 0.935 1.122 Ruby 1.8.6 broken (stack level too deep)
app_fib 7.512 1.977
app_mandelbrot 2.440 1.096
app_pentomino 107.936 59.806
app_raise 2.490 2.844
app_strconcat 1.804 1.181
app_tak 9.663 2.716
app_tarai 7.735 2.137
app_uri 4.668 2.600
io_file_create 1.853 2.416
io_file_read 1.155 1.928
io_file_write 0.800 0.679
interpreter_launch 0.014 0.043
loop_generator 24.565 1.783
loop_times 5.900 4.465
loop_whileloop 10.408 1.905
loop_whileloop2 2.081 0.381
so_ackermann 14.262 2.206 Ruby 1.8.6 broken (stack level too deep)
so_array 7.754 4.515
so_binary_trees 3.337 1.561
so_concatenate 2.189 1.326
so_count_words 1.555 8.424
so_exception 4.236 4.018
so_fannkuch 78.685 60.227
so_fasta 10.763 7.407
so_k_nucleotide 6.204 5.736
so_lists 1.347 1.104
so_mandelbrot 33.010 19.185
so_matrix 2.301 1.232
so_meteor_contest 37.336 23.410
so_nbody 23.977 12.724
so_nested_loop 6.051 3.962
so_nsieve 23.447 8.462
so_nsieve_bits 52.250 10.413
so_object 7.018 2.717
so_partial_sums 27.290 13.360
so_pidigits 5.956 7.021
so_random 2.216 0.788
so_reverse_complement 3.889 4.517
so_sieve 0.691 0.225
so_spectralnorm 28.181 14.619
vm1_block* 16.039 5.496
vm1_const* 6.748 0.903
vm1_ensure* 7.159 0.039
vm1_ivar* 6.559 4.133
vm1_ivar_set* 6.834 4.635
vm1_length* 9.990 2.970
vm1_neq* 8.226 1.571
vm1_not* 2.479 0.723
vm1_rescue* 3.486 0.234
vm1_simplereturn* 11.952 3.225
vm1_swap* 15.258 0.737
vm2_array* 3.878 2.879
vm2_case* 2.863 0.418
vm2_eval* 13.586 58.712
vm2_method* 11.159 4.984
vm2_mutex* 3.337 3.828
vm2_poly_method* 15.176 6.595
vm2_poly_method_ov* 2.635 0.646
vm2_proc* 5.466 1.988
vm2_regexp* 3.005 3.792
vm2_send* 2.424 0.734
vm2_super* 3.108 1.289
vm2_unif1* 2.055 0.678
vm2_zsuper* 3.666 1.339
vm3_thread_create_join 0.532 5.130
vm3_thread_mutex 78.377 46.367
lib_coderay 3.119 3.135
lib_json_pure 0.370 0.283
lib_rdoc_coderay 4.295 6.019
interpreter_start 0.007 0.020
interpreter_require 0.054 0.112