<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Zen and the Art of Programming &#187; Ruby Benchmark Suite</title>
	<atom:link href="http://programmingzen.com/category/programming-languages/ruby/ruby-benchmark-suite/feed/" rel="self" type="application/rss+xml" />
	<link>http://programmingzen.com</link>
	<description>Meditations on programming, startups, and technology</description>
	<lastBuildDate>Wed, 09 May 2012 07:52:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>The Great Ruby Shootout (July 2010)</title>
		<link>http://programmingzen.com/2010/07/19/the-great-ruby-shootout-july-2010/</link>
		<comments>http://programmingzen.com/2010/07/19/the-great-ruby-shootout-july-2010/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 18:12:31 +0000</pubDate>
		<dc:creator>Antonio Cangiano</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby Benchmark Suite]]></category>

		<guid isPermaLink="false">http://programmingzen.com/?p=1233</guid>
		<description><![CDATA[The Great Ruby Shootout measures the performance of several Ruby implementations by testing them against a series of synthetic benchmarks. Recently I ran Mac and Windows shootouts as well, which tested a handful of implementations. However this article reports on the results of extensive benchmark testing of eight different Ruby implementations on Linux. The setup [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p>The Great Ruby Shootout measures the performance of several Ruby implementations by testing them against a series of synthetic benchmarks. Recently I ran <a href="http://programmingzen.com/2010/05/16/benchmarking-macruby-0-6/">Mac</a> and <a href="http://programmingzen.com/2010/06/28/the-great-ruby-shootout-windows-edition/">Windows</a> shootouts as well, which tested a handful of implementations. However this article reports on the results of extensive benchmark testing of eight different Ruby implementations on Linux.</p>
<p><strong>The setup</strong></p>
<p>For this shootout I included a subset of the <a href="http://github.com/acangiano/ruby-benchmark-suite">Ruby Benchmark Suite</a>. I opted to primarily exclude tests that were executed in fractions of a second in most VMs, focusing instead of more substantial benchmarks (several of which came from the <a href="http://shootout.alioth.debian.org/">Computer Language Benchmarks Game</a>). The best times and least memory allocations out of five runs are reported here for each benchmark.</p>
<p>All tests were run on Ubuntu 10.4 LTS x86_64, on an Intel Core 2 Quad Q6600 2.40 GHz, 8 GB DDR2 RAM, with two 500 GB 7200 rpm disks.</p>
<p><strong>8 implementations</strong></p>
<p>The implementations tested were:</p>
<ul>
<li>Ruby 1.8.7 p299</li>
<li>Ruby 1.9.1 p378</li>
<li>Ruby 1.9.2 RC2</li>
<li>IronRuby 1.0 (Mono 2.4.4)</li>
<li>JRuby 1.5.1 (Java HotSpot(TM) 64-Bit Server VM 1.6.0_20)</li>
<li>MagLev (rev 23832)</li>
<li>Ruby Enterprise Edition 2010.02</li>
<li>Rubinius 1.0.1</li>
</ul>
<p>JRuby was run with the &#8211;fast and &#8211;server optimization flags.</p>
<p><strong>Disclaimer</strong></p>
<p>Synthetic benchmarks cannot predict how fast your programs will be when dealing with a particular implementation. They provide an (entertaining) educated guess, but you shouldn’t draw overly definitive conclusions from them. The values reported here should be assumed to be characteristic of server-side &mdash; and long running &mdash; processes; they should be taken with a grain of salt.</p>
<p><strong>Time Results</strong></p>
<p>Please find below the execution times for the selected tests. Timeouts indicate that the execution of a single iteration for a given test took more than 300 seconds and had to be interrupted. Bold, green values indicate the best performer out of each test.</p>
<p><em>Warning: The bm_primes.rb benchmark was originally written to aid the development of the Prime class. As such in 1.9.2 it was rewritten in C, which makes it a poor representation of implementation performance. This benchmark will removed in the future.</em> </p>
<p align="center"><img src="http://programmingzen.com/wp-content/uploads/2010/07/linux-time-table1.png" alt="Time Table on Linux" /></p>
<p>If you are not interested in the individual test results, the information presented in the table above is summarized directly below:</p>
<pre class="highlight">
  Ruby 1.9.2         JRuby
Min.   : 0.013   Min.   : 0.382
1st Qu.: 3.258   1st Qu.: 3.051
Median : 4.543   Median : 4.997
Mean   : 9.262   Mean   : 9.180
3rd Qu.: 8.573   3rd Qu.: 8.969
Max.   :45.009   Max.   :48.850

    MagLev         Ruby 1.9.1
Min.   : 0.351   Min.   : 0.015
1st Qu.: 2.140   1st Qu.: 3.387
Median : 6.069   Median : 6.205
Mean   : 9.100   Mean   :10.860
3rd Qu.: 9.266   3rd Qu.:11.559
Max.   :51.221   Max.   :46.849

 Ruby 1.8.7         IronRuby
Min.   : 0.708   Min.   :  3.601
1st Qu.: 5.102   1st Qu.: 10.505
Median : 8.380   Median : 12.912
Mean   :18.785   Mean   : 26.539
3rd Qu.:24.793   3rd Qu.: 36.115
Max.   :75.653   Max.   :135.204

   Rubinius           REE
Min.   : 0.484   Min.   : 0.584
1st Qu.: 3.087   1st Qu.: 4.343
Median : 9.636   Median : 6.660
Mean   :13.232   Mean   :15.036
3rd Qu.:17.674   3rd Qu.:21.336
Max.   :73.050   Max.   :61.960
</pre>
<p>For the sake of convenience, I also produced a box plot from the successful data points:</p>
<p align="center"><img src="http://programmingzen.com/wp-content/uploads/2010/07/linux-time-plot.png" alt="Box plot of times"/></p>
<p>There are a few considerations based on these results that I feel are worth mentioning:</p>
<ul>
<li>As you can see Ruby 1.9, JRuby and MagLev converge towards a similar performance level according to these tests.</li>
<li>Ruby 1.9.2 manages to squeeze in a bit of extra speed when compared to Ruby 1.9.1 (which is a welcome improvement).</li>
<li>Ruby 1.9 seems to be either much faster than Ruby 1.8 or roughly as fast, depending on the test. This appears to be in line with what I&#8217;ve seen in real world programs. There are programs that will only receive a 10-20% boost from 1.9, while others improve drastically. The results really depends on what a program spends its time doing.</li>
<li>Performance wise, Rubinius is really starting to be a much more serious contender.</li>
<li>Ruby Enterprise Edition is slightly faster than Ruby 1.8.7, to the extent where this is clearly visible in almost all of the tests.</li>
<li>IronRuby running on Mono was the worse of the lot.</li>
</ul>
<p><strong>Memory Results</strong></p>
<p>The following table shows the approximate memory consumption for each implementation when running each benchmark:</p>
<p align="center"><img src="http://programmingzen.com/wp-content/uploads/2010/07/linux-memory-table.png" alt="Memory allocation on Linux" /></p>
<p>Summarized:</p>
<pre class="highlight">
  Ruby 1.9.2        Ruby 1.9.1
Min.   :  4.320   Min.   :  4.580
1st Qu.:  4.378   1st Qu.:  4.695
Median :  6.285   Median :  6.920
Mean   : 20.795   Mean   : 15.669
3rd Qu.: 10.162   3rd Qu.: 11.383
Max.   :171.500   Max.   :100.570

   Ruby 1.8            REE
Min.   :  3.040   Min.   :  8.220
1st Qu.:  4.290   1st Qu.:  9.682
Median :  7.745   Median : 15.565
Mean   : 20.698   Mean   : 27.014
3rd Qu.: 11.273   3rd Qu.: 38.620
Max.   :103.520   Max.   :125.910

  Rubinius           MagLev
Min.   : 37.63   Min.   : 81.74
1st Qu.: 39.78   1st Qu.: 82.52
Median : 45.48   Median : 83.53
Mean   : 65.70   Mean   : 96.29
3rd Qu.: 58.22   3rd Qu.: 98.10
Max.   :215.33   Max.   :175.85   

    JRuby
Min.   : 49.04
1st Qu.: 71.23
Median :176.72
Mean   :169.41
3rd Qu.:209.04
Max.   :404.06
</pre>
<p>And finally, in graph form:</p>
<p align="center"><img src="http://programmingzen.com/wp-content/uploads/2010/07/linux-memory-plot1.png" alt="Memory Box Plot" /></p>
<p>A few considerations on memory:</p>
<ul>
<li>Memory readings for IronRuby were not available, so they were not included.</li>
<li>Ruby 1.9.2 uses the least amount of memory (as one might expect).</li>
<li>JRuby was by far the most memory intensive of the group.</li>
<li>Ruby Enterprise Edition used less memory than 1.8.7 in a few tests, but overall was more memory hungry than 1.8.7. This is really odd and entirely unexpected.</li>
</ul>
<p><strong>Linux Vs. Windows</strong></p>
<p>This shootout and the Windows one were both performed on the same machine, thus we can compare how the same implementation perform under different operating systems. The only adjustment that’s required is the timeout. Every result longer than 60 seconds from this shootout needs to be considered a timeout, because the previous shootout did so as well.</p>
<p>It is commonly believed that Ruby performs much better on Linux than on Windows (with the exception of IronRuby). Let&#8217;s find out if these test results confirm that notion.</p>
<p>Ruby 1.8.7:</p>
<p align="center"><img src="http://programmingzen.com/wp-content/uploads/2010/07/lin-win-187-table.png" alt="Ruby 1.8.7 on Linux and Windows" /></p>
<p>Ruby 1.9.2:</p>
<p align="center"><img src="http://programmingzen.com/wp-content/uploads/2010/07/lin-win-192-table.png" alt="Ruby 1.9.2 on Linux and Windows" /></p>
<p>JRuby:</p>
<p align="center"><img src="http://programmingzen.com/wp-content/uploads/2010/07/lin-win-jruby-table.png" alt="JRuby on Linux and Windows" /></p>
<p>Finally, in chart form (yellow entries are on Windows as indicated by the labels containing W):</p>
<p align="center"><img src="http://programmingzen.com/wp-content/uploads/2010/07/lin-win-plot.png" alt="Ruby on Linux Vs. Windows" /></p>
<p>To use a beloved MythBusters expression, this myth is confirmed.</p>
<p><strong>Note</strong>: As requested by a few commenters, here is a comparison of IronRuby as well (.NET 4.0 Vs. Mono 2.4.4):</p>
<p align="center"><img src="http://programmingzen.com/wp-content/uploads/2010/07/lin-win-ir-table.png" alt="Ruby 1.8.7 on Linux and Windows" /></p>
<p><strong>Conclusion</strong></p>
<p>In conclusion, let me just state that it’s nice to see several implementations getting faster. Ruby 1.9.2, JRuby, MagLev and Rubinius are all becoming serious competitors and working their respective ways closer to a similar performance level. If you think these benchmark shootouts are becoming boring, then the results are becoming more stable and predictable. I suspect that as time goes on, performance will not be the real distinguishing factor when choosing a Ruby implementation, other features will be.</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://programmingzen.com/2010/07/19/the-great-ruby-shootout-july-2010/feed/</wfw:commentRss>
		<slash:comments>32</slash:comments>
		</item>
		<item>
		<title>The Great Ruby Shootout (Windows Edition)</title>
		<link>http://programmingzen.com/2010/06/28/the-great-ruby-shootout-windows-edition/</link>
		<comments>http://programmingzen.com/2010/06/28/the-great-ruby-shootout-windows-edition/#comments</comments>
		<pubDate>Mon, 28 Jun 2010 19:00:28 +0000</pubDate>
		<dc:creator>Antonio Cangiano</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby Benchmark Suite]]></category>

		<guid isPermaLink="false">http://programmingzen.com/?p=1220</guid>
		<description><![CDATA[This post contains the results of a Ruby shootout on Windows that I recently conducted. You can find the Mac edition, published last month, here. I was planning to have this one ready much sooner, but a couple of serious events in personal life prevented that from happening. Be sure to grab my feed or [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p>This post contains the results of a Ruby shootout on Windows that I recently conducted. You can find the Mac edition, published last month, <a href="http://programmingzen.com/2010/05/16/benchmarking-macruby-0-6/">here</a>. I was planning to have this one ready much sooner, but a couple of serious events in personal life prevented that from happening. Be sure to grab <a href="http://feeds2.feedburner.com/ZenAndTheArtOfRubyProgramming">my feed</a> or <a href="http://antoniocangiano.us1.list-manage1.com/subscribe?u=9fd2908bf379ac3d3b9f2d8e3&#038;id=cec4240b96">join the newsletter</a> to avoid missing the upcoming Linux shootout.</p>
<p><strong>The setup</strong></p>
<p>For this shootout I included a subset of the <a href="http://github.com/acangiano/ruby-benchmark-suite">Ruby Benchmark Suite</a>. I opted to primarily exclude tests that were executed in fractions of a second in most VMs, focusing instead of more substantial benchmarks (several of which come from the Computer Language Benchmarks Game). The best times out of five runs are reported here for each benchmark.</p>
<p>All tests were run on Windows 7 x64, on an Intel Core 2 Quad Q6600 2.40 GHz, 8 GB DDR2 RAM, with two 500 GB 7200 rpm disks.</p>
<p>The implementations tested were:</p>
<ul>
<li><strong>Ruby 1.8.7</strong> (2010-01-10 patchlevel 249) [i386-mingw32] (RubyInstaller)</li>
<li><strong>Ruby 1.9.1 p378</strong> (2010-01-10 revision 26273) [i386-mingw32] (RubyInstaller)</li>
<li><strong>Ruby 1.9.2 dev</strong> (2010-05-31) [i386-mingw32] (experimental)</li>
<li><strong>JRuby 1.5.1</strong> (ruby 1.8.7 patchlevel 249) (2010-06-06 f3a3480) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_20) [amd64-java]</li>
<li><strong>IronRuby 1.0</strong> x64 for .NET 4.0</li>
</ul>
<p>JRuby was run with the <code>--fast</code> and <code>--server</code> optimization flags.</p>
<p><strong>Disclaimer</strong></p>
<p>Synthetic benchmarks cannot predict how fast your programs will be when dealing with a particular implementation. They provide an (entertaining) educated guess, but <strong>you shouldn&#8217;t draw overly definitive conclusions from them</strong>. The values reported here should be assumed to be characteristic of server-side &#8211; and long running &#8211; processes and should be taken with a grain of salt.</p>
<p><strong>The results</strong></p>
<p>Please find below the execution times for the selected tests. Timeouts indicate that the execution of a single iteration for a given test took more than 60 seconds and had to be interrupted. Bold values indicate the best performance for each test.</p>
<p style="text-align: center;" align="center">
	<img src="http://programmingzen.com/wp-content/uploads/2010/06/rbs-win.png" alt="RBS Windows Shootout" />
</p>
<p><strong>Conclusions</strong></p>
<p>Despite a couple of errors and a few timeouts, JRuby was the fastest of the lot, which can be seen as impressive<del datetime="2010-07-04T02:18:01+00:00"> if we consider that this is Windows we are talking about after all</del>.</p>
<p>Ruby 1.9.1 and 1.9.2 were almost as fast as JRuby on these tests. With a few exceptions, the performances of the two 1.9 implementations were, expectedly, very similar.</p>
<p>JRuby, 1.9.1 and 1.9.2 were all faster than the current MRI implementation, which can be seen as a prerequisite as we move, as a community, away from Ruby 1.8. Finally, it&#8217;s worth noting that IronRuby&#8217;s performance was however in line with that of Ruby 1.8.7.</p>
<p><strong>Update (July 3, 2010)</strong>: The following box plot compares the various implementations for the tests for which all the implementations were successful. Only times for the largest successful input number were used in those tests where multiple input numbers were tested.</p>
<p align="center"><img src="http://programmingzen.com/wp-content/uploads/2010/05/windows_shootout.png" alt="Windows Shootout Boxplot" /></p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://programmingzen.com/2010/06/28/the-great-ruby-shootout-windows-edition/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Benchmarking MacRuby 0.6</title>
		<link>http://programmingzen.com/2010/05/16/benchmarking-macruby-0-6/</link>
		<comments>http://programmingzen.com/2010/05/16/benchmarking-macruby-0-6/#comments</comments>
		<pubDate>Sun, 16 May 2010 07:53:35 +0000</pubDate>
		<dc:creator>Antonio Cangiano</dc:creator>
				<category><![CDATA[Featured Article]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby Benchmark Suite]]></category>

		<guid isPermaLink="false">http://antoniocangiano.com/?p=1168</guid>
		<description><![CDATA[Recently MacRuby 0.6 was released. The development team put a lot of emphasis on improving compatibility with Ruby 1.9, and the viability of MacRuby as a tool for developing Mac OS X applications. Focus on these aspects took precedence over performance, but I was still curious to see how well it performed when compared to [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p>Recently MacRuby 0.6 was released. The development team put a lot of emphasis on improving compatibility with Ruby 1.9, and the viability of MacRuby as a tool for developing Mac OS X applications. Focus on these aspects took precedence over performance, but I was still curious to see how well it performed when compared to Ruby 1.8.7 and Ruby 1.9, respectively.</p>
<p>This article showcases the results of a small Ruby shootout for Mac. I plan to publish a Windows one by next week, and then a week or two after that, a complete Linux shootout that will have many more implementations. Grab <a href="http://feeds2.feedburner.com/ZenAndTheArtOfRubyProgramming">my feed</a> or <a href="http://eepurl.com/xDb7">join the newsletter</a> to avoid missing upcoming shootout posts.</p>
<p><strong>The setup</strong></p>
<p>The tests are a large subset of the <a href="http://github.com/acangiano/ruby-benchmark-suite">Ruby Benchmark Suite</a>. Each test was run 10 times, five to detect the best execution time, and five to detect the minimal memory consumption. All of the tests were run on Mac OS X 10.6.3, on my MacBook Pro 2.66 GHz Intel Core 2 Duo, 4 GB 1067 MHz DDR3 RAM, 320 GB 7200 rpm disk.</p>
<p>Stable implementations tested:</p>
<ul>
<li>MacRuby 0.6</li>
<li>Ruby 1.8.7</li>
<li>Ruby 1.9.1</li>
</ul>
<p><strong>Disclaimer</strong></p>
<p>Synthetic benchmarks cannot predict how fast your programs will be with one implementation or another. They provide an (entertaining) educated guess, but <strong>you shouldn&#8217;t draw overly definitive conclusions from them</strong>. Furthermore, the Ruby Benchmark Suite has many tests that don&#8217;t provide much insight when it comes to comparing implementations. They are there for legacy reasons and will probably be removed in the future. For the time being, <strong>take them with a grain of salt</strong>.</p>
<p><strong>The results</strong></p>
<p>Without further hesitation, here are the execution times for the tests (divided in A-L, M-Z). Timeouts indicate that the execution of a single run took more than 60 seconds and had to be interrupted. Bold values indicate the best performance for each test.</p>
<p style="text-align: center;"><img class="aligncenter" src="http://antoniocangiano.com/wp-content/uploads/2010/05/timeal1.png" alt="Time table A-L" /></p>
<p style="text-align: center;"><img class="aligncenter" src="http://antoniocangiano.com/wp-content/uploads/2010/05/timemz.png" alt="Time table M-Z" /></p>
<p>And here is the estimated memory usage:</p>
<p style="text-align: center;"><img class="aligncenter" src="http://antoniocangiano.com/wp-content/uploads/2010/05/spaceal.png" alt="Memory table A-L" /></p>
<p style="text-align: center;"><img class="aligncenter" src="http://antoniocangiano.com/wp-content/uploads/2010/05/spacemz.png" alt="Memory table M-Z" /></p>
<p><strong>Conclusions</strong></p>
<p>MacRuby 0.6 is faster than Ruby 1.9.1 at times, but it can also be significantly slower. Overall, as things stand now, its performance appears to be between that of Ruby 1.9.1 and Ruby 1.8.7, with several outliers and a greater variance compared to those two implementations. Memory wise, MacRuby appears to be significantly more &#8220;memory hungry&#8221; than the other implementations (even though this wasn&#8217;t all that much of a surprise to me).</p>
<p>I&#8217;m interested in seeing how future releases that will be focused more on performance will affect these preliminary results. For the time being however, don&#8217;t let this outcome discourage you from using MacRuby 0.6, which is the first release that&#8217;s considered stable for Mac OS X development.</p>
<p>Download: <a href="http://antoniocangiano.com/wp-content/uploads/2010/05/time-memory.zip">CSV Files</a></p>
<p>PS: If you are looking for a fun and easy way to get started with MacRuby, check out <a href="http://thinkcode.tv/catalog/introduction-macruby/">ThinkCode.TV&#8217;s screencast</a> on the subject.</p>
<p><strong>Update (July 3, 2010)</strong>: The following box plot compares the various implementations for the tests for which all the implementations were successful. Only times for the largest successful input number were used in those tests where multiple input numbers were tested.</p>
<p align="center"><img src="http://programmingzen.com/wp-content/uploads/2010/05/mac_shootout.png" alt="Mac Shootout Boxplot" /></p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://programmingzen.com/2010/05/16/benchmarking-macruby-0-6/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>How much faster is Ruby on Linux?</title>
		<link>http://programmingzen.com/2009/08/10/how-much-faster-is-ruby-on-linux/</link>
		<comments>http://programmingzen.com/2009/08/10/how-much-faster-is-ruby-on-linux/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 13:00:23 +0000</pubDate>
		<dc:creator>Antonio Cangiano</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby Benchmark Suite]]></category>

		<guid isPermaLink="false">http://antoniocangiano.com/?p=1026</guid>
		<description><![CDATA[In a previous article I compared the performance of Ruby on Windows, built through Microsoft Visual C++ and GCC. The numbers for the MinGW version were very impressive. So the question now becomes, how does its performance compare to that of Ruby on Linux? To quote one person (Alex) who commented on the aforementioned post: [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p>In a previous article I <a href="http://antoniocangiano.com/2009/08/04/a-faster-ruby-on-windows-is-possible/"> compared the performance of Ruby on Windows</a>, built through Microsoft Visual C++ and GCC. The numbers for the MinGW version were very impressive. So the question now becomes, how does its performance compare to that of Ruby on Linux? To quote one person (Alex) who commented on the aforementioned post:</p>
<blockquote><p>With the new mingw32 substantial speed improvements, think it makes sense now to also test at least the baseline (MRI) on Mac/Linux on the same battery of tests, so we Windows folks could get a better idea of how far behind are we yet and what the different Windows interpreters speed target shall be.</p></blockquote>
<p>Any sort of performance improvement for something that is notoriously slow on Windows is more than welcome, but would this be enough to fill the gap between Ruby&#8217;s performance on Windows and on Linux? How much faster is Ruby on Linux? Let&#8217;s find out.</p>
<p><strong><big>Setup</big></strong></p>
<ul>
<li>As a reminder, the operating systems used were Windows XP SP3 32bit and Ubuntu 9.04 32 bit.</li>
<li>The Ruby implementations tested were ruby 1.8.6 (2009-03-31 patchlevel 368) [i386-mingw32], ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-mingw32], Ruby 1.8.6 (built from source on Linux) and Ruby 1.9.1 (built from source on Linux as well). The same identical versions of Ruby were used for both operating systems. I&#8217;m aware that these are not the latest available versions for Linux, but we are trying to compare apples to apples.</li>
<li>I used the <a href="http://github.com/acangiano/ruby-benchmark-suite/tree/master">Ruby Benchmark Suite</a>; the times reported are the best out of five runs, with a timeout of 300 seconds per each iteration.</li>
</ul>
<p><strong><big>Benchmark results</big></strong></p>
<p>The following table/image compares the performance of Ruby 1.8.6 on Windows and Linux. A light green background indicates which of the two was faster. The total times exclude tests that raised an error or were not available (N/A) for any of the four implementations, but includes timeouts (they are counted as 300 seconds to provide a lower bound). The ratio column indicates how many times faster Ruby on Linux was:</p>
<p align="center"><img src="http://antoniocangiano.com/wp-content/uploads/2009/08/Ruby-Linux-Windows1.gif" alt="Ruby 1.8.6 on Windows and Linux" /></p>
<p>The second table/image below compares Ruby 1.9.1 on Windows and on Linux, using the same criteria as above.</p>
<p align="center"><img src="http://antoniocangiano.com/wp-content/uploads/2009/08/Ruby-Linux-Windows21.gif" alt="Ruby 1.9.1 on Windows and Linux" /></p>
<p>Note: The totals shown are different from the ones seen in other posts since the subset of benchmarks included in the totals is different.</p>
<p><strong><big>Conclusion</big></strong></p>
<p>According to the geometric mean of the ratios for these tests, it appears that on average <strong>Ruby 1.8.6 on Linux is about twice as fast as Ruby 1.8.6 on Windows</strong>. Conversely, <strong>Ruby 1.9.1 on Linux is about 70% faster than the Windows version</strong>.</p>
<p>The Windows implementations use GCC 3.4.5 (a four year old compiler) at the moment, while I built the implementations on Ubuntu with GCC 4.3.3 (which is available by default). This helps, at least in part, to justify the performance gap. Luis Lavena, leader of the Windows port, confirmed to me that a switch to GCC 4.4.x is planned for the future. This should significantly increase performance on Windows yet again, and bump Ruby&#8217;s speed on Windows a bit closer to the speed that&#8217;s obtainable on Linux.</p>
<p>For the time being, switching to Ruby 1.9.1 on Windows will give you a performance that is better than what&#8217;s obtained by those who are still using Ruby 1.8.x on Linux. If it&#8217;s possible, switch.</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://programmingzen.com/2009/08/10/how-much-faster-is-ruby-on-linux/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>A faster Ruby on Windows is possible (benchmarks for 4 implementations inside)</title>
		<link>http://programmingzen.com/2009/08/04/a-faster-ruby-on-windows-is-possible/</link>
		<comments>http://programmingzen.com/2009/08/04/a-faster-ruby-on-windows-is-possible/#comments</comments>
		<pubDate>Tue, 04 Aug 2009 06:00:08 +0000</pubDate>
		<dc:creator>Antonio Cangiano</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby Benchmark Suite]]></category>

		<guid isPermaLink="false">http://antoniocangiano.com/?p=932</guid>
		<description><![CDATA[In yesterday&#8217;s post I compared IronRuby 0.9, Ruby 1.8.6 (from the One-Click Installer) and Ruby 1.9.1 (downloaded from the official site) against one another. IronRuby did great, but the discussion in the comment section quickly veered towards what version of the One-Click Ruby Installer should have been used. I justified my choice of using the [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p>In <a href="http://antoniocangiano.com/2009/08/03/performance-of-ironruby-ruby-on-windows/">yesterday&#8217;s post</a> I compared IronRuby 0.9, Ruby 1.8.6 (from the One-Click Installer) and Ruby 1.9.1 (downloaded from the official site) against one another. IronRuby did great, but the discussion in the comment section quickly veered towards what version of the One-Click Ruby Installer should have been used.</p>
<p>I justified my choice of using the <a href="http://rubyforge.org/frs/?group_id=167&#038;release_id=28426">&#8220;old&#8221; One-Click Installer</a>, by the fact that I wasn&#8217;t aware of official releases of the new installer. As well as that the old One-Click Installer is the most widely downloaded version. Very few people are familiar with the upcoming version of the project. This point is about to change.</p>
<p>Luis Lavena took over the One-Click Installer project and has been working on the next version (<a href="http://github.com/oneclick/rubyinstaller/tree/master">RubyInstaller</a> from now on), the aim of which is to replace the One-Click Installer by building Ruby 1.8 and 1.9 with MinGW and <span class="caps">GCC</span>. In theory, this brings performance gains on Windows to the table, and gets rid of having to use Visual C++ 6 (a &#8220;ten year old compiler&#8221;) to build Ruby and other native gems. The project also strives to be lighter by bundling fewer (unnecessary) gems for Windows users.</p>
<p>There&#8217;s no doubt that in the long run, this new project will become the de facto standard for Windows, but the questions on everyone&#8217;s mind are, should I bother with it now? How much of a performance boost are we talking about here? 10%? 20%? Let&#8217;s find out.</p>
<p>In this follow up article I&#8217;m going to compare the performance of <a href="http://rubyforge.org/frs/?group_id=167&#038;release_id=28426">Ruby 1.8.6 from the One-Click Installer</a> (mswin32), <a href="http://rubyinstaller.org/downloads/">Ruby 1.8.6 from RubyInstaller</a> (mingw32), Ruby 1.9 (mswin32) downloaded from the <a href="http://ruby-lang.org">Ruby-Lang.com site</a>, and <a href="http://rubyinstaller.org/downloads/">Ruby 1.9 from the RubyInstaller project</a> (mingw32) against one another. I&#8217;ll copy and paste part of the setup and disclaimer from yesterday&#8217;s post, for those who haven&#8217;t read it. Feel free to skip this part if you wish.</p>
<p><strong><big>Setup</big></strong></p>
<ul>
<li>The benchmarks were run within a virtual machine with 2 GB of <span class="caps">DDR3 RAM</span> and a 2.66 GHz Intel Core 2 Duo processor. The operating system adopted was Windows <span class="caps">XP SP3</span> (32 bit) with the .NET Framework 3.5 <span class="caps">SP1</span> installed.</li>
<li>Here I employed a large subset of the current <a href="http://github.com/acangiano/ruby-benchmark-suite/tree/master">Ruby Benchmark Suite project</a>. The source code for all of the benchmarks is available within the repository.</li>
<li>The best time out of five runs is reported for each benchmark. When the results report a Timeout, it means that more than 300 seconds were required for a single iteration and was therefore interrupted. Conversely, N/A means that a test that was compatible for the given implementation was not available or the setup on my machine was lacking the required libraries to execute it (1 test affected).</li>
</ul>
<p><strong><big>Disclaimer</big></strong></p>
<ul>
<li>An attempt has been made to improve the quality of the tests. Some of them may be more representative of realistic workloads, but most of them remain micro-benchmarks. They are indicative of how these implementations compare, but cannot be viewed as a guarantee of how they will actually affect your own programs.</li>
<li>There are <a href="http://en.wikipedia.org/wiki/Lies,_damned_lies,_and_statistics">lies, damned lies, and statistics</a>.</li>
</ul>
<p><strong><big>Benchmark results</big></strong></p>
<p>The table/image below shows the times for each benchmark, for Ruby 1.8.6 (mswin32), Ruby 1.8.6 (mingw32), Ruby 1.9.1 (mswin32), and Ruby 1.9.1 (mingw32). In the table I used (RI) as shorthand for RubyInstaller to indicate mingw32 versions.</p>
<p align="center"><img src="http://antoniocangiano.com/wp-content/uploads/2009/08/mri_kri_windows.png" alt="mswin32 vs mingw32"  /></p>
<p>Red values are errors, timeouts and inapplicable tests. Green, bold values indicate better times than what Ruby 1.8.6 (mswin32) delivered. A pale yellow background indicates the best time for a given benchmark. Total time is the run-time for the subset of benchmarks that were successfully executed by all four implementations. Timeouts have been included this time around. Each timeout has been counted as an additional 300 seconds.</p>
<p>The total runtime (including timeouts) is summarized in the chart below:</p>
<p align="center"><img src="http://antoniocangiano.com/wp-content/uploads/2009/08/mri_kri_total_runtime.png" alt="Total Runtime" /></p>
<p><strong><big>Conclusion</big></strong></p>
<p>Wow! Ruby 1.8.6 (mingw32) improves from 3% to 664% (depending on the test), over the current One-Click Installer. The geometric mean of the ratios (read &#8220;on average&#8221;) tells us that <strong>it was about 283% faster</strong>. The Ruby 1.9.1 version provided by the RubyInstaller was slower than the mswin32 version in a couple of tests, but faster everywhere else. How much faster? Up to 342% faster, with an average (again calculated through the geometric mean of the ratios) of <strong>a 77% increase in speed</strong>.</p>
<p>These finds prompt me to ask, what are we waiting for? You know how unresponsive Ruby is on Windows, and how tests take forever to execute? These mingw32-based releases may very well solve this. And incidentally the bar has been raised for IronRuby as well. I formally invite the Ruby on Windows community to embrace these two projects.</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://programmingzen.com/2009/08/04/a-faster-ruby-on-windows-is-possible/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Comparing the performance of IronRuby, Ruby 1.8 and Ruby 1.9 on Windows</title>
		<link>http://programmingzen.com/2009/08/03/performance-of-ironruby-ruby-on-windows/</link>
		<comments>http://programmingzen.com/2009/08/03/performance-of-ironruby-ruby-on-windows/#comments</comments>
		<pubDate>Mon, 03 Aug 2009 12:00:08 +0000</pubDate>
		<dc:creator>Antonio Cangiano</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby Benchmark Suite]]></category>

		<guid isPermaLink="false">http://antoniocangiano.com/?p=908</guid>
		<description><![CDATA[In my latest article I discussed the importance of JRuby as a means of introducing Ruby to the Enterprise world. Most of the companies that belong to this ecosystem are Java based, but we cannot forget that a sizable portion of them are Microsoft-centric. Within these companies, Ruby will be far more welcome if a [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p>In my <a href="http://antoniocangiano.com/2009/07/28/on-jrubys-importance-for-the-future-of-ruby/">latest article</a> I discussed the importance of JRuby as a means of introducing Ruby to the Enterprise world. Most of the companies that belong to this ecosystem are Java based, but we cannot forget that a sizable portion of them are Microsoft-centric. Within these companies, Ruby will be far more welcome if a .NET implementation is available. The answer to this need is sufficiently fulfilled by <a href="http://ironruby.com/">IronRuby</a> (version 0.9 was just <a href="http://blog.jimmy.schementi.com/2009/08/ironruby-09-released.html">released</a>).</p>
<p>IronRuby has been progressing fast lately. First came support for Rails and then, with this release, a great deal of effort has been placed on improving performance. In the past, IronRuby was <a href="http://antoniocangiano.com/2008/12/09/the-great-ruby-shootout-december-2008/">all but fine-tuned</a>. In fact, it was several times slower than Ruby <span class="caps">MRI</span>, as the team worked on improving compatibility with Ruby 1.8 and mostly ignored performance.</p>
<p>In this article I&#8217;m going to provide some performance results for IronRuby 0.9 on Windows, which I&#8217;m sure will interest readers of this blog as well as of <a href="http://www.amazon.com/gp/product/0470374950?ie=UTF8&#38;tag=zenruby-20&#38;linkCode=as2&#38;camp=1789&#38;creative=9325&#38;creativeASIN=0470374950">my book</a>. Before revealing all the details, let&#8217;s start with the setup and a disclaimer. Please read through it carefully, because the old, trite comments about how &#8220;micro-benchmarks are useless&#8221; won&#8217;t be published. We&#8217;ve already been there, folks. Thank you all for your understanding.</p>
<p><big><strong>Setup</strong></big></p>
<ul>
<li>The benchmarks were run within a virtual machine with 2 GB of <span class="caps">DDR3 RAM</span> and a 2.66 GHz Intel Core 2 Duo processor. The operating system adopted was Windows <span class="caps">XP SP3</span> (32 bit) with the .NET Framework 3.5 <span class="caps">SP1</span> installed.</li>
<li>Here I employed a large subset of the current <a href="http://github.com/acangiano/ruby-benchmark-suite/tree/master">Ruby Benchmark Suite</a> project. The source code for all of the benchmarks is available within the repository.</li>
<li>The best time out of five runs is reported for each benchmark. When the results report a Timeout, it means that more than 300 seconds were required for a single iteration and was therefore interrupted. Conversely, N/A means that a test that was compatible for the given implementation was not available (2 tests) or the setup on my machine was lacking the required libraries to execute it (1 test).</li>
<li>I realize that there is a MinGW One-Click Installer effort that may improve the performance of Ruby on Windows. Here however, I used the regular One-Click Installer as it is the most common one (it&#8217;s been downloaded almost 3.5 million times so far). For Ruby 1.9 I used the binary provided by the <a href="http://www.ruby-lang.org/en/downloads/">download page</a> on the official Ruby site.</li>
</ul>
<p><big><strong>Disclaimer</strong></big></p>
<ul>
<li>An attempt has been made to improve the quality of the tests. Some of them may be more representative of realistic workloads, but most of them remain micro-benchmarks. They are indicative of how IronRuby compares to <span class="caps">MRI</span> (Ruby 1.8) and <span class="caps">KRI</span> (Ruby 1.9) performance-wise, but cannot be viewed as a guarantee of how this will actually affect your own programs.</li>
<li>I didn&#8217;t calculate a RubySpec completeness score for IronRuby. That said, IronRuby 0.9 should be a fairly complete implementation of Ruby 1.8.</li>
<li>There are <a href="http://en.wikipedia.org/wiki/Lies,_damned_lies,_and_statistics">lies, damned lies, and statistics</a>.</li>
</ul>
<p><big><strong>Benchmark results</strong></big></p>
<p>The table below shows the times for each benchmark, for IronRuby 0.9, Ruby 1.8.6 (2008-08-11 patchlevel 287) and Ruby 1.9.1p0 (2009-01-30 revision 21907):</p>
<div align="center">
<table border=0 cellpadding=0 cellspacing=0 width=664 style='border-collapse:<br />
   collapse;table-layout:fixed'><br />
<col width=327>
<col class=xl24 width=52>
<col width=95 span=3>
<tr height=13>
<td height=13 class=xl25 width=327>Benchmark File</td>
<td class=xl26 width=52>#</td>
<td class=xl26 width=95>Ruby 1.8.6</td>
<td class=xl26 width=95>IronRuby</td>
<td class=xl26 width=95>Ruby 1.9.1</td>
</tr>
<tr height=13>
<td height=13 class=xl27>macro-benchmarks/bm_gzip.rb</td>
<td class=xl31>100</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
<td class=xl28 style='color:#DD0806'>IOError</td>
<td class=xl28 style='color:#DD0806'>N/A</td>
</tr>
<tr height=13>
<td height=13 class=xl27>macro-benchmarks/bm_hilbert_matrix.rb</td>
<td class=xl31>20</td>
<td class=xl28>1.891</td>
<td class=xl29>0.453</td>
<td class=xl33>0.125</td>
</tr>
<tr height=13>
<td height=13 class=xl27>macro-benchmarks/bm_hilbert_matrix.rb</td>
<td class=xl31>30</td>
<td class=xl28>7.422</td>
<td class=xl29>1.719</td>
<td class=xl33>0.656</td>
</tr>
<tr height=13>
<td height=13 class=xl27>macro-benchmarks/bm_hilbert_matrix.rb</td>
<td class=xl31>40</td>
<td class=xl28>21.500</td>
<td class=xl29>4.625</td>
<td class=xl33>2.266</td>
</tr>
<tr height=13>
<td height=13 class=xl27>macro-benchmarks/bm_hilbert_matrix.rb</td>
<td class=xl31>50</td>
<td class=xl28>56.765</td>
<td class=xl29>10.031</td>
<td class=xl33>5.109</td>
</tr>
<tr height=13>
<td height=13 class=xl27>macro-benchmarks/bm_hilbert_matrix.rb</td>
<td class=xl31>60</td>
<td class=xl28>111.859</td>
<td class=xl29>18.781</td>
<td class=xl33>11.297</td>
</tr>
<tr height=13>
<td height=13 class=xl27>macro-benchmarks/bm_norvig_spelling.rb</td>
<td class=xl31>50</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
<td class=xl29>41.313</td>
<td class=xl33>31.453</td>
</tr>
<tr height=13>
<td height=13 class=xl27>macro-benchmarks/bm_sudoku.rb</td>
<td class=xl31>1</td>
<td class=xl28>43.734</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
<td class=xl33>6.313</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_app_factorial.rb</td>
<td class=xl31>5000</td>
<td class=xl28>1.328</td>
<td class=xl33>0.063</td>
<td class=xl29>0.266</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_app_fib.rb</td>
<td class=xl31>30</td>
<td class=xl28>6.156</td>
<td class=xl33>0.594</td>
<td class=xl29>0.813</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_app_fib.rb</td>
<td class=xl31>35</td>
<td class=xl28>74.125</td>
<td class=xl33>6.922</td>
<td class=xl29>9.344</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_app_mandelbrot.rb</td>
<td class=xl31>1</td>
<td class=xl28>11.953</td>
<td class=xl29>6.922</td>
<td class=xl33>0.641</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_app_pentomino.rb</td>
<td class=xl31>1</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
<td class=xl33>59.938</td>
<td class=xl29>75.859</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_app_strconcat.rb</td>
<td class=xl31>1.5M</td>
<td class=xl28>30.469</td>
<td class=xl33>2.141</td>
<td class=xl29>4.813</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_app_tak.rb</td>
<td class=xl31>7</td>
<td class=xl28>5.516</td>
<td class=xl33>0.531</td>
<td class=xl29>0.578</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_app_tak.rb</td>
<td class=xl31>8</td>
<td class=xl28>15.609</td>
<td class=xl33>1.484</td>
<td class=xl29>1.703</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_app_tak.rb</td>
<td class=xl31>9</td>
<td class=xl28>45.843</td>
<td class=xl33>3.953</td>
<td class=xl29>4.531</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_app_tarai.rb</td>
<td class=xl31>3</td>
<td class=xl28>19.985</td>
<td class=xl33>1.844</td>
<td class=xl29>2.156</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_app_tarai.rb</td>
<td class=xl31>4</td>
<td class=xl28>19.796</td>
<td class=xl33>2.219</td>
<td class=xl29>2.656</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_app_tarai.rb</td>
<td class=xl31>5</td>
<td class=xl28>24.235</td>
<td class=xl33>2.688</td>
<td class=xl29>3.063</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_binary_trees.rb</td>
<td class=xl31>1</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
<td class=xl29>53.078</td>
<td class=xl33>37.375</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_count_multithreaded.rb</td>
<td class=xl31>16</td>
<td class=xl28>0.297</td>
<td class=xl33>0.266</td>
<td class=xl30>0.328</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_count_shared_thread.rb</td>
<td class=xl31>16</td>
<td class=xl28>0.250</td>
<td class=xl33>0.188</td>
<td class=xl29>0.203</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_fannkuch.rb</td>
<td class=xl31>8</td>
<td class=xl28>3.625</td>
<td class=xl33>0.344</td>
<td class=xl29>0.563</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_fannkuch.rb</td>
<td class=xl31>10</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
<td class=xl33>40.750</td>
<td class=xl29>65.438</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_fasta.rb</td>
<td class=xl31>1M</td>
<td class=xl28>192.937</td>
<td class=xl33>23.703</td>
<td class=xl29>35.234</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_fractal.rb</td>
<td class=xl31>5</td>
<td class=xl28>43.172</td>
<td class=xl33>4.672</td>
<td class=xl29>5.781</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_gc_array.rb</td>
<td class=xl31>1</td>
<td class=xl28>228.672</td>
<td class=xl33>32.031</td>
<td class=xl29>59.828</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_gc_mb.rb</td>
<td class=xl31>500K</td>
<td class=xl28>8.109</td>
<td class=xl29>1.109</td>
<td class=xl33>0.469</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_gc_mb.rb</td>
<td class=xl31>1M</td>
<td class=xl28>16.172</td>
<td class=xl29>2.391</td>
<td class=xl33>1.016</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_gc_mb.rb</td>
<td class=xl31>3M</td>
<td class=xl28>44.953</td>
<td class=xl29>6.906</td>
<td class=xl33>2.938</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_gc_string.rb</td>
<td class=xl31>1</td>
<td class=xl28>47.937</td>
<td class=xl29>25.250</td>
<td class=xl33>11.938</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_knucleotide.rb</td>
<td class=xl31>1</td>
<td class=xl28>9.625</td>
<td class=xl29>2.906</td>
<td class=xl33>2.016</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_lucas_lehmer.rb</td>
<td class=xl31>9689</td>
<td class=xl28>122.672</td>
<td class=xl33>18.125</td>
<td class=xl29>36.250</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_lucas_lehmer.rb</td>
<td class=xl31>9941</td>
<td class=xl28>156.750</td>
<td class=xl33>19.625</td>
<td class=xl29>39.391</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_lucas_lehmer.rb</td>
<td class=xl31>11213</td>
<td class=xl28>179.915</td>
<td class=xl33>28.844</td>
<td class=xl29>61.063</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_lucas_lehmer.rb</td>
<td class=xl31>19937</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
<td class=xl33>159.078</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_mandelbrot.rb</td>
<td class=xl31>1</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
<td class=xl33>65.781</td>
<td class=xl29>81.766</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_mbari_bogus1.rb</td>
<td class=xl31>1</td>
<td class=xl33>0.031</td>
<td class=xl30>40.406</td>
<td class=xl30>8.781</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_mbari_bogus2.rb</td>
<td class=xl31>1</td>
<td class=xl28>0.156</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
<td class=xl28 style='color:#DD0806'>N/A</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_mergesort_hongli.rb</td>
<td class=xl31>3000</td>
<td class=xl28>25.282</td>
<td class=xl33>3.531</td>
<td class=xl29>6.031</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_mergesort.rb</td>
<td class=xl31>1</td>
<td class=xl28>24.735</td>
<td class=xl29>3.906</td>
<td class=xl33>3.219</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_meteor_contest.rb</td>
<td class=xl31>1</td>
<td class=xl28>147.704</td>
<td class=xl33>19.713</td>
<td class=xl29>19.781</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_monte_carlo_pi.rb</td>
<td class=xl31>10M</td>
<td class=xl28>79.406</td>
<td class=xl33>5.109</td>
<td class=xl29>20.672</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_nbody.rb</td>
<td class=xl31>100K</td>
<td class=xl28>37.625</td>
<td class=xl33>8.281</td>
<td class=xl29>10.938</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_nsieve_bits.rb</td>
<td class=xl31>8</td>
<td class=xl28>69.656</td>
<td class=xl29>33.156</td>
<td class=xl33>6.531</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_nsieve.rb</td>
<td class=xl31>9</td>
<td class=xl28>58.344</td>
<td class=xl33>5.453</td>
<td class=xl28 style='color:#DD0806'>N/A</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_partial_sums.rb</td>
<td class=xl31>2.5M</td>
<td class=xl28>93.391</td>
<td class=xl33>10.797</td>
<td class=xl29>26.422</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_pathname.rb</td>
<td class=xl31>100</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_primes.rb</td>
<td class=xl31>3000</td>
<td class=xl28>21.359</td>
<td class=xl29>9.594</td>
<td class=xl33>0.031</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_primes.rb</td>
<td class=xl31>30K</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
<td class=xl33>0.469</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_primes.rb</td>
<td class=xl31>300K</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
<td class=xl33>5.281</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_primes.rb</td>
<td class=xl31>3M</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
<td class=xl33>100.406</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_quicksort.rb</td>
<td class=xl31>1</td>
<td class=xl28>51.046</td>
<td class=xl29>11.594</td>
<td class=xl33>8.703</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_regex_dna.rb</td>
<td class=xl31>20</td>
<td class=xl28>181.172</td>
<td class=xl29>21.188</td>
<td class=xl33>11.938</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_reverse_compliment.rb</td>
<td class=xl31>1</td>
<td class=xl28>61.875</td>
<td class=xl33>48.469</td>
<td class=xl30>138.047</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_so_ackermann.rb</td>
<td class=xl31>7</td>
<td class=xl28>2.234</td>
<td class=xl29>0.563</td>
<td class=xl33>0.484</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_so_ackermann.rb</td>
<td class=xl31>9</td>
<td class=xl28>50.000</td>
<td class=xl29>14.938</td>
<td class=xl33>9.281</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_so_array.rb</td>
<td class=xl31>9000</td>
<td class=xl28>26.328</td>
<td class=xl33>8.984</td>
<td class=xl29>10.781</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_so_count_words.rb</td>
<td class=xl31>100</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
<td class=xl29>60.688</td>
<td class=xl33>42.250</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_so_exception.rb</td>
<td class=xl31>500K</td>
<td class=xl28>78.125</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
<td class=xl33>32.672</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_so_lists_small.rb</td>
<td class=xl31>1000</td>
<td class=xl28>13.906</td>
<td class=xl29>4.250</td>
<td class=xl33>3.172</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_so_lists.rb</td>
<td class=xl31>1000</td>
<td class=xl28>64.531</td>
<td class=xl29>22.266</td>
<td class=xl33>16.797</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_so_matrix.rb</td>
<td class=xl31>60</td>
<td class=xl28>8.312</td>
<td class=xl29>2.781</td>
<td class=xl33>2.125</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_so_object.rb</td>
<td class=xl31>500K</td>
<td class=xl28>16.375</td>
<td class=xl29>5.313</td>
<td class=xl33>1.672</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_so_object.rb</td>
<td class=xl31>1M</td>
<td class=xl28>29.312</td>
<td class=xl29>10.500</td>
<td class=xl33>2.844</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_so_object.rb</td>
<td class=xl31>1.5M</td>
<td class=xl28>43.312</td>
<td class=xl29>16.000</td>
<td class=xl33>4.281</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_so_sieve.rb</td>
<td class=xl31>4000</td>
<td class=xl28>241.922</td>
<td class=xl29>37.859</td>
<td class=xl33>35.688</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_socket_transfer_1mb.rb</td>
<td class=xl31>10K</td>
<td class=xl28>13.266</td>
<td class=xl28 style='color:#DD0806'>SocketError</td>
<td class=xl33>3.359</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_spectral_norm.rb</td>
<td class=xl31>100</td>
<td class=xl28>5.110</td>
<td class=xl29>0.922</td>
<td class=xl33>0.719</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_sum_file.rb</td>
<td class=xl31>100</td>
<td class=xl28 style='color:#DD0806'>Timeout</td>
<td class=xl33>20.406</td>
<td class=xl29>23.797</td>
</tr>
<tr height=13>
<td height=13 class=xl27>micro-benchmarks/bm_word_anagrams.rb</td>
<td class=xl31>1</td>
<td class=xl28>70.828</td>
<td class=xl29>30.188</td>
<td class=xl33>8.125</td>
</tr>
<tr height=13>
<td height=13 class=xl26>TOTAL TIME</td>
<td class=xl26>-</td>
<td class=xl32>2933.334</td>
<td class=xl32>607.088</td>
<td class=xl32>664.094</td>
</tr>
</table></div>
<p><br/></p>
<p>Red values are errors, timeouts, inapplicable tests and times that were worse than Ruby 1.8.6. Green, bold values are better times than what Ruby 1.8.6 delivered. A pale yellow background indicates the best time for a given benchmark. Total time is the runtime for the subset of benchmarks that were successfully executed by all three implementations (whose cardinality is 54).</p>
<p>The total runtime is summarized by the chart below:</p>
<p align="center"><img src="http://antoniocangiano.com/wp-content/uploads/2009/08/rir_total_runtime.png" alt="Total runtime" /></p>
<p>And let&#8217;s compare each of the &#8220;macro-benchmarks&#8221; on an individual basis:</p>
<p align="center"><img src="http://antoniocangiano.com/wp-content/uploads/2009/08/rir_macrobenchmarks.png" alt="Macro-benchmarks chart" /></p>
<p><big><strong>Conclusions</strong></big></p>
<p>IronRuby went from being much slower than Ruby <span class="caps">MRI</span> to considerably faster across nearly all the tests. That&#8217;s major progress for sure, and the team behind the project deserves mad props for it.</p>
<p>One final warning before we get too excited here. IronRuby is not faster than Ruby 1.9.1 at this stage. Don&#8217;t let that first chart mislead you. While it&#8217;s faster in certain tests, it&#8217;s also slower is many others. Currently, it&#8217;s situated between Ruby 1.8.6 and Ruby 1.9.1, but much closer to the latter. The reason why this chart is misleading is that it doesn&#8217;t take into account any tests that timed out, and several of such timeouts were caused by IronRuby (more than those caused by Ruby 1.9.1). If you were to add, say, 300 seconds to the total, for each timeout for the two implementations, you&#8217;d quickly see that Ruby 1.9.1 still has the edge. The second chart that compares macro-benchmarks does a better job at realistically showing how IronRuby sits between Ruby 1.8.6 and Ruby 1.9.1 from a performance standpoint. If you were to plot every single benchmark on a chart, you&#8217;d find a similar outcomes for a large percentage of the tests.</p>
<p>Whether it&#8217;s faster than Ruby 1.9 or not, now that good performances are staring to show up, it&#8217;s easier to see IronRuby delivering on it&#8217;s goal of becoming the main implementation choice for those who both develop and deploy on Windows. This, paired with the .NET and possible Visual Studio integration, the great tools available to .NET developers, and the ability to execute Ruby code in the browser client-side thanks to projects like Silverlight/Moonlight and <a href="http://visitmix.com/Labs/gestalt/">Gestalt</a>, make the project all the more interesting.</p>
<p>What are your thoughts on IronRuby, and how will this dramatic performance gain affect your projects?</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://programmingzen.com/2009/08/03/performance-of-ironruby-ruby-on-windows/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Reflections on the Ruby shootout</title>
		<link>http://programmingzen.com/2008/12/10/reflections-on-the-ruby-shootout/</link>
		<comments>http://programmingzen.com/2008/12/10/reflections-on-the-ruby-shootout/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 04:47:10 +0000</pubDate>
		<dc:creator>Antonio Cangiano</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby Benchmark Suite]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://antoniocangiano.com/?p=430</guid>
		<description><![CDATA[Yesterday I published The Great Ruby Shootout and it quickly gathered a fair deal of attention. It was on the front page of Slashdot, Hacker News, Reddit, and so on. More than 15,000 people came by to read about the results of my comparison between Ruby implementations. Those numbers looked good but something didn&#8217;t add [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p>Yesterday I published <a href="http://antoniocangiano.com/2008/12/09/the-great-ruby-shootout-december-2008/">The Great Ruby Shootout</a> and it quickly gathered a fair deal of attention. It was on the front page of  Slashdot, Hacker News, Reddit, and so on. More than 15,000 people came by to read about the results of my comparison between Ruby implementations.</p>
<p>Those numbers looked good but something didn&#8217;t add up. Ever since I clicked the &#8220;Publish&#8221; button, I had a very uneasy feeling about the  main shootout figures. They just didn&#8217;t seem right. I had a chance, particularly during the writing of <a href="http://antoniocangiano.com/my_ruby_on_rails_book.php">my book</a>, to extensively use Ruby on Vista and I can  guarantee you that it&#8217;s visibly slower than on GNU/Linux. The Phusion team had benchmarked their Ruby Enterprise Edition against Ruby 1.8.6  many times, and found it to be about 25% faster. Yet my results were showing it as twice as fast than Ruby 1.8.7, which in turn is already faster than 1.8.6. To makes things worse, I&#8217;ve used Ruby 1.9 and found it to be faster than Ruby 1.8.7, but not 5 times as fast. For most programs that I tried Rubinius didn&#8217;t seem faster than Ruby 1.8. And the more I pondered it, the more it began to feel like one too many things didn&#8217;t add up.</p>
<p>In the comments, Isaac Gouy reported a couple of issues with the  Excel formulas, where a few unsuccessful tests were mistakenly added to the totals. This skewed the results slightly, particularly in terms of penalizing JRuby. However, this wasn&#8217;t really it. Sure, the totals were inaccurate, but not enough to fundamentally change the main outcome of those results.</p>
<p>As I was discussing this somewhat unexpected result with Hongli Lai (co-author of Ruby Enterprise Edition), he mentioned that he knew what might be causing this anomaly. I had run the initial test against Ruby installed through apt-get, because I&#8217;d made a couple of assumptions. The first was that most people would probably be using the Ruby version that was deployed by their OS&#8217; packaging system in both development and production mode. The second was that the  performance of this version would be roughly similar to the one built from scratch. This second assumption would turn out to be highly mistaken.</p>
<p>I decided to run a test using Ruby 1.8.7 built from source as the baseline and added a column for Ruby 1.8.7, installed through apt-get, to the tables. In addition I also corrected the issue pointed out by Isaac. I updated the original shootout with the correct data, and what you see below is   a bar chart for the geometric mean of the ratios for the successful benchmarks.</p>
<div align="center"><img src="http://antoniocangiano.com/images/shootout3/chart_geomean_small.png" alt="Geometric mean bar chart" /></div>
<p><br/>
<p>Notice how everything makes much more sense now. Ruby 1.9 and JRuby are very close, respectively 2.5 and 1.9 faster than Ruby 1.8.7 (from source) on these benchmarks. Less impressive result sure, but I suspect much more realistic. The results for Ruby Enterprise Edition are in  line with the 25% speed increase, if we consider that 1.8.7 is a bit faster than 1.8.6. Rubinius is still slower than MRI for most tests, but it&#8217;s improving. Ruby on Windows is slow. So slow in fact, that Ruby on GNU/Linux is twice as fast.</p>
<p>The really big, flashing warning though is what happens when you install Ruby through apt-get.  Compiling from source gives you double the speed, according to these tests. I expected a 10/20% increase, not 100%. The gist of it is that prepackaged Ruby is compiled using the option &#8211;enable-pthreads and there is the whole issue of shared vs static libraries. But whatever the reason, this is a significant difference. For production use, in light of these results, I feel that it would be foolish to use the slower version of Ruby provided by apt-get/aptitude.</p>
<p>I rectified the results as soon as possible because the last thing I wanted was to mislead the Ruby community or worse still, betray its trust.  Major kudos to Isaac for spotting the calculation issue, and Hongli for selflessly pointing out that the excellent Ruby Enterprise Edition results were probably due to the low performance of the Ubuntu&#8217;s version of Ruby.</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://programmingzen.com/2008/12/10/reflections-on-the-ruby-shootout/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>The Great Ruby Shootout (December 2008)</title>
		<link>http://programmingzen.com/2008/12/09/the-great-ruby-shootout-december-2008/</link>
		<comments>http://programmingzen.com/2008/12/09/the-great-ruby-shootout-december-2008/#comments</comments>
		<pubDate>Tue, 09 Dec 2008 14:08:30 +0000</pubDate>
		<dc:creator>Antonio Cangiano</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Merb]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby Benchmark Suite]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://antoniocangiano.com/?p=407</guid>
		<description><![CDATA[The long awaited Ruby virtual machine shootout is here. In this report I&#8217;ve compared the performances of several Ruby implementations against a set of synthetic benchmarks. The implementations that I tested were Ruby 1.8 (aka MRI), Ruby 1.9 (aka Yarv), Ruby Enterprise Edition (aka REE), JRuby 1.1.6RC1, Rubinius, MagLev, MacRuby 0.3 and IronRuby. Disclaimer Just [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p>The long awaited Ruby virtual machine shootout is here. In this report I&#8217;ve compared the performances of several Ruby implementations against a set of synthetic benchmarks. The implementations that I tested were <a hre="http://www.ruby-lang.org/en/">Ruby 1.8</a> (aka MRI), <a href="http://www.ruby-lang.org/en/downloads/">Ruby 1.9</a> (aka Yarv), <a href="http://www.rubyenterpriseedition.com/">Ruby Enterprise Edition</a> (aka REE), <a href="http://jruby.codehaus.org/">JRuby 1.1.6RC1</a>, <a href="http://rubini.us/">Rubinius</a>, <a href="http://ruby.gemstone.com/">MagLev</a>, <a href="http://www.macruby.org/trac/wiki/MacRuby">MacRuby 0.3</a> and <a href="http://www.ironruby.net/">IronRuby</a>.</p>
<p><br/></p>
<h4>Disclaimer</h4>
<p><br/></p>
<p>Just as with <a href="http://antoniocangiano.com/2007/12/03/the-great-ruby-shootout/">the previous shootout</a>, before proceeding to the results, I urge you to consider the following important points:</p>
<ul>
<li><a href="http://www.engineyard.com/">Engine Yard</a> sponsors this website, and also happens to sponsor, to a much greater extent, the Rubinius project. Needless to say, there is no bias in the reporting of the data below concerning Rubinius;</li>
<li>Don&#8217;t read too much into this and don&#8217;t draw any final conclusions. Each of these exciting projects has its own reason for being, as well as different pros and cons, which are not considered in this post. They each have a different level of maturity and completeness. Furthermore, not all of them have received the same level of optimization yet. Take this post for what it is: an interesting and fun comparison of Ruby implementations;</li>
<li>The results here may change entirely in a matter of months. There will be other future shootouts on this blog. If you wish, <a href="http://feeds.feedburner.com/ZenAndTheArtOfRubyProgramming">grab the feed and follow along</a>;</li>
<li>The scope of the benchmarks is limited because they can&#8217;t test every single feature of each implementation nor include every possible program. They&#8217;re just a sensible set of micro-benchmarks which give us a general idea of where we are in terms of speed. They aren&#8217;t meant to be absolutely accurate when it comes to predicting real world performance;</li>
<li>Many people are interested in the kind of improvements that the tested VMs can bring to a Ruby on Rails deployment stack. Please do not assume that if VM A is three times faster than VM B, that Rails will serve three times the amount of requests per minute. It won&#8217;t. That said, a faster VM is good news and can definitely affect Rails applications positively in production;</li>
<li>These tests were run on the machines at my disposal, your mileage may vary. Please do test the VMs that interest you on your hardware and against programs you actually need/use;</li>
<li>In this article, I sometimes blur the distinction between &#8220;virtual machine&#8221; and &#8220;interpreter&#8221; by simply calling them &#8220;virtual machines&#8221; for the sake of simplicity;</li>
<li>Some of the benchmarks are more interesting for VM implementers than for end users. That said, if you think the benchmarks being tested are silly/inadequate/lame, feel free to contribute code to the <a href="http://github.com/acangiano/ruby-benchmark-suite/tree/master">Ruby Benchmark Suite</a> and if accepted, they&#8217;ll make it into the next shootout;</li>
<li>Finally, keep in mind that there are three kinds of lies: <a href="http://en.wikipedia.org/wiki/Lies,_damned_lies,_and_statistics">lies, damned lies, and statistics</a>.</li>
</ul>
<p><br/></p>
<h4>Ruby implementations being tested</h4>
<p><br/></p>
<p>All of the Ruby implementations that were able to run the current Ruby Benchmark Suite have been grouped together in one main shootout. This group consists of Ruby 1.8.7 (p72, built from source, and installed through apt-get), Ruby 1.9.1 (from trunk, p5000 revision 20560), Ruby Enterprise Edition (1.8.6-20081205), JRuby 1.1.6RC1 and Rubinius (from trunk), all of them were tested on Ubuntu 8.10 x64, plus Ruby 1.8.6 (p287. from the One-Click Installer) on Windows Vista Ultimate x64. The hardware used for this benchmark was my desktop workstation with an Intel Core 2 Quad Q6600 (2.4 GHz) CPU and 8 GB of RAM. JRuby was run with the -J-server option enabled and by specifying 4 Mb of stack (required to pass certain recursive benchmarks). The best times out of five iterations were reported, and these do not include startup times or the time required to parse and compile classes and method for the first time. Several of these new tests also have variable input sizes.</p>
<p>The MagLev team provided me with an early alpha version of MagLev for the purpose of testing it in this shootout. Since this VM is not mature enough yet to run the Ruby Benchmark Suite, I used custom scripts against an old version of the Ruby Benchmark Suite on Ubuntu 8.10 x64. MagLev was tested, along with Ruby 1.8.6 (p287), on the same machine as that of the main shotoout, though the benchmarks were different (even when they had the same names as the ones in the main shootout).</p>
<p>MacRuby 0.3 and Ruby 1.8.6 (p114) were tested on Mac OS X Leopard using the previous version of the Ruby Benchamrk Suite. Since my MacBook Pro died (sigh), for this benchmark I used a Mac Pro, with two Quad-Core Intel Xeon 2.8 Ghz processors and 18 GB of RAM.</p>
<p>IronRuby (from trunk) and Ruby 1.8.6 (p287) were tested on a previous version of the Ruby Benchmark Suite on Windows Vista x64 on the same quad-core used for the main shootout. The MagLev, MacRuby and IronRuby numbers reported here were the best times out of five iterations, and include startup time. IronRuby on Mono was not tested because I couldn&#8217;t get it to work on my machine, despite having tried several IronRuby versions and two different Mono versions. Please also notice that Ruby 1.8.6 (p287) was tested twice on Windows, once for the main shootout against the current Ruby Benchmark Suite, and a second time to compare it with IronRuby, against the old benchmarks.
<p><b>Note</b>: As tempting as it is, do not compare implementations that belong to different shootouts directly to one another. It would be very disingenuous to directly compare VMs tested with different benchmarks and/or different machines. The only comparisons that make sense are the ones within each of the four groups.</p>
<p><br/></p>
<h4>Main shootout</h4>
<p><br/></p>
<p>The following table shows the run times for the main implementations. The table is fairly wide, so you&#8217;ll have to click on the image to view the data in a new tab.</p>
<div align="center"><a href="http://antoniocangiano.com/images/shootout3/main_time.png" title="Click to enlarge this figure" target="_blank"><img src="http://antoniocangiano.com/images/shootout3/main_time_small.gif" alt="Main Shootout's times" /></a></div>
<p><br/></p>
<p>Green, bold values indicate that the given virtual machine was faster than Ruby 1.8.7 on GNU/Linux (our baseline), whereas a yellow background indicates the absolute fastest implementation for a given benchmark. Values in red are slower than the baseline. Timeout indicates that the script didn’t terminate in a reasonable amount of time and was (automatically) interrupted. The values reported at the bottom are the total amounts of time (in seconds) that it would take to run the common subset of benchmarks which were successfully executed by every virtual machine. When our baseline VM generated an error, others were used, starting with Ruby 1.8.7 on Vista (for color coding purposes only).</p>
<p>The following image shows a bar chart of the total time requested for the common subset of successfully executed benchmarks (those whose names are in blue within the tables):</p>
<div align="center"><img src="http://antoniocangiano.com/images/shootout3/chart_total_time_small.png" alt="Total Time" /></div>
<p><br/></p>
<p>More interestingly, the following table shows the ratios of each Ruby implementation based on the baseline (MRI):</p>
<div align="center"><a href="http://antoniocangiano.com/images/shootout3/main_geomean.png" title="Click to enlarge this figure" target="_blank"><img src="http://antoniocangiano.com/images/shootout3/main_geomean_small.gif" alt="Main Shootout's ratios" /></a></div>
<p><br/></p>
<p>The baseline time is divided by the time at hand to obtain a number that tells us &#8220;how many times faster&#8221; an implementation is for a given benchmark. 2.0 means twice as fast, while 0.5 means half the speed (so twice as slow). The geometric mean at the bottom of the table tells us how much faster or slower a virtual machine was when compared to the main Ruby interpreter, on &#8220;average&#8221;. Just as with the totals above, only those 101 tests, which were successfully run by each VM, where included in the calculation.</p>
<p>More concisely, here is a bar chart showing the geometric mean of the ratios for the various implementations tested:</p>
<div align="center"><img src="http://antoniocangiano.com/images/shootout3/chart_geomean_small.png" alt="Geometric Mean" /></div>
<p><br/></p>
<p>I prefer to let the data speak for itself, but I&#8217;d like to briefly comment on these results. Just a few quick considerations.</p>
<p>Working off of the <a href="http://en.wikipedia.org/wiki/Geometric_mean">geometric mean</a> of the ratios for the successful tests, Ruby MRI compiled from source is twice as fast than the Ruby shipped by Ubuntu, and by the One-Click Installer on Vista. The huge performance gap between ./configure &#038;&#038; make &#038;&#038; sudo make install and sudo apt-get install ruby-full should not be taken lightly when deploying in production. These numbers also reveal what most of us already knew: Ruby is particularly slow on Windows (<a href="http://groups.google.com/group/capistrano/msg/f5213577eaeadc47?pli=1">800-pound gorillas in the room</a>, or not).</p>
<p>Performance-wise Rubinius has more work left to be done to catch up with Ruby 1.8.7 and other faster VMs, particularly if we take into account the number of timeouts. But it has improved in the past year and I think it’s on the right track.</p>
<p>Ruby Enterprise Edition is about as fast as Ruby 1.8.7 compiled from source, which is reasonable considering that it&#8217;s a patched version of Ruby 1.8.6 aimed at the reduction of memory consumption (a parameter which wasn&#8217;t tested within the current shootout).</p>
<p>Speaking of excellent results, Ruby 1.9.1 and JRuby 1.1.6 both did <b>very</b> well. It looks like we finally have a couple of relatively fast alternatives to what is a slow main interpreter. According to the results above, and with the exception of a few tests, on average they are respectively 2.5 and 2 times faster than Ruby 1.8.7 (from source), and 5 and 4 times faster than Ruby 1.8.7 installed through apt-get on Ubuntu or Ruby 1.8.6 installed through the One-Click installer on Vista. Again, this does not mean than every program (particularly Rails) will gain that kind of speed, but these results are very encouraging nevertheless.</p>
<p><br/></p>
<h4>MagLev</h4>
<p><br/></p>
<p>There has been a lot of buzz about MagLev since Avi Bryant&#8217;s first benchmarks were shown a few months ago. Here we finally see it being put to the test. The table below shows the times obtained by running MagLev and Ruby 1.8.6 (p287) against MagLev&#8217;s set of benchmarks based on the old Ruby Benchmark Suite:</p>
<div align="center"><img src="http://antoniocangiano.com/images/shootout3/maglev_time.png" alt="MagLev's times" /></div>
<p><br/></p>
<p>And here are the ratios:</p>
<div align="center"><img src="http://antoniocangiano.com/images/shootout3/maglev_geomean.png" alt="MagLev's ratios" /></div>
<p><br/></p>
<p>You&#8217;ll notice how MagLev swings from being much faster than MRI to being much slower. I believe there is much room for improvement, but at almost twice the speed of MRI, these early results are definitely promising.</p>
<p><br/></p>
<h4>MacRuby</h4>
<p><br/></p>
<p>These are the times for MacRuby 0.3 on Mac OS X 10.5.5:</p>
<div align="center"><img src="http://antoniocangiano.com/images/shootout3/macruby_time.png" alt="MacRuby's times" /></div>
<p><br/></p>
<p>And of course, the ratios against the MRI baseline:</p>
<div align="center"><img src="http://antoniocangiano.com/images/shootout3/macruby_geomean.png" alt="MacRuby's ratios" /></div>
<p><br/></p>
<p>MacRuby is relatively new, so these are not bad results. More work is required, but it&#8217;s a good start.</p>
<p><br/></p>
<h4>IronRuby</h4>
<p><br/></p>
<p>Finally (I promise these are the last ones), here are the two tables for IronRuby and Ruby 1.8.6:</p>
<div align="center"><img src="http://antoniocangiano.com/images/shootout3/ironruby_time.png" alt="IronRuby's times" /></div>
<div align="center"><img src="http://antoniocangiano.com/images/shootout3/ironruby_geomean.png" alt="IronRuby's ratios" /></div>
<p><br/></p>
<p>IronRuby is slower than Ruby 1.8.6 on Windows, which in turn is much slower than Ruby 1.8.7 on GNU/Linux. This is not very surprising. This project has been focusing on integrating with .NET and catching up with the implementation of the language by improving the RSpec pass rate, as opposed to performing any optimizations and/or fine tuning (as per <a href="http://rubyconf2008.confreaks.com/ironruby.html">John Lam&#8217;s presentation</a> at RubyConf 2008). We&#8217;ll measure its improvements in the next shootouts.</p>
<p><br/></p>
<h4>Conclusion</h4>
<p><br/></p>
<p>Overall I think these are great results. Ruby 1.8 (MRI), with its slowness and memory leaks, belongs to the past. It&#8217;s time for the community to move forward and on to something better and faster &#8211; and we don&#8217;t lack interesting alternatives to do so at this stage.</p>
<p>I hope that for the next shootout, MagLev, MacRuby and IronRuby will be able to run the benchmark suite, so that they can all be tested and directly compared with each other. I also hope to include Tim Bray&#8217;s XML benchmark, some sort of &#8220;Pet Shop&#8221; sample Rails and Merb application and, above all, include memory usage statistics.</p>
<p>You can find the Excel file for the main shootout <a href="http://antoniocangiano.com/files/MainShootout3.0.xls">here</a>. That&#8217;s all for now. Feel free to comment, <a href="http://feeds.feedburner.com/ZenAndTheArtOfRubyProgramming">subscribe to my feed</a>, share this link and promote it on <a href="http://news.ycombinator.com/item?id=391301">Hacker News</a>, <a href="http://www.reddit.com/r/programming/comments/7ic05/the_great_ruby_shootout_december_2008/">Reddit</a>, <a href="http://www.dzone.com/links/the_great_ruby_shootout_december_2008.html">DZone</a>, StumbleUpon, <a href="http://twitter.com/">Twitter</a>, and Co. Putting together this shootout was a lot of work, so I definitely appreciate you spreading the word about it. Until next time&#8230;</p>
<p><b>Update (December 10, 2008)</b>: This article has been updated to correct a couple of major issues with yesterday&#8217;s results. I adjusted my commentary as well, in light of the corrected figures.</p>
<p><b>Update (February 7, 2009)</b>: Thanks to Makoto Kuwata, <a href="http://jp.rubyist.net/magazine/?0025-TheGreatRubyShootout">a Japanese version of this article</a> was published in the Rubyist Magazine.</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://programmingzen.com/2008/12/09/the-great-ruby-shootout-december-2008/feed/</wfw:commentRss>
		<slash:comments>40</slash:comments>
		</item>
		<item>
		<title>Merb, Rails Myths, Language Popularity and other Zenbits</title>
		<link>http://programmingzen.com/2008/11/14/merb-rails-myths-language-popularity-and-other-zenbits/</link>
		<comments>http://programmingzen.com/2008/11/14/merb-rails-myths-language-popularity-and-other-zenbits/#comments</comments>
		<pubDate>Fri, 14 Nov 2008 23:50:53 +0000</pubDate>
		<dc:creator>Antonio Cangiano</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Books]]></category>
		<category><![CDATA[DB2]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Merb]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby Benchmark Suite]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Zenbits]]></category>

		<guid isPermaLink="false">http://antoniocangiano.com/?p=381</guid>
		<description><![CDATA[Zenbits are posts which include a variety of interesting subjects that I&#8217;d like to talk about briefly, without writing a post for each of them. Merb: A few days ago Merb 1.0 was released. Congratulations to Ezra Zygmuntowicz on this important milestone, the Merb community and Engine Yard (who finances the project). Merb 1.0 wasn&#8217;t [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p><em><strong>Zenbits</strong> are posts which include a variety of interesting subjects that I&#8217;d like to talk about briefly, without writing a post for each of them.</em></p>
<p><strong>Merb:</strong> A few days ago <a href="http://brainspl.at/articles/2008/11/08/merb-1-0">Merb 1.0</a> was released. Congratulations to Ezra Zygmuntowicz on this important milestone, the Merb community and <a href="http://engineyard.com">Engine Yard</a> (who finances the project). Merb 1.0 wasn&#8217;t even out yet when some people had already started commenting on the fracturing of the Ruby community that this new framework might bring with this, and the impact that this high visibility &#8220;competitor&#8221; might have on Rails. I believe that having more than one widely adopted web framework will only benefit the Ruby community. Furthermore, it&#8217;s important to remember that this is not a zero-sum game. Ruby programmers are perfectly capable of learning two frameworks and using one or the other, depending on the project at hand. This is particularly true if we consider that Merb, for all of its advantages &#8211; and disadvantages &#8211; when compared to Rails, is not totally different from its forerunner. If you are an expert Rails programmer, you should be able to become proficient in Merb in very little time. To help with this process, the Merb community needs to concentrate on the documentation now, given that the API is finally stable.</p>
<p><strong>Rails Myths:</strong> David Heinemeier Hansson began <a href="http://www.loudthinking.com/posts/29-the-rails-myths">a series of posts about Rails Myths</a>. I like the idea of seeing common myths addressed straight from the horse&#8217;s mouth. Over the past two years, Rails has received quite a bit of backslash and old fashion FUD, so it&#8217;s important to set the record straight, whether the myths are entirely fabricated or if there is some element of truth to them. Whether you agree with David or not, it&#8217;s also nice to hear two sides of the same story. In fact, at the beginning of <a href="http://antoniocangiano.com/my_ruby_on_rails_book.php">my book</a> I debunk a few myths, just to set the record straight regarding what some readers may have heard surrounding the framework. It was a fun part to write.</p>
<p><strong>My Book:</strong> Speaking of my book, <a href="http://antoniocangiano.com/my_ruby_on_rails_book.php">Ruby on Rails for Microsoft Developers</a>, I&#8217;m getting closer to the finish line. I&#8217;m about to complete Chapter 9 (out of eleven chapters). The initial schedule I was provided with has been extended slightly so that there will be sufficient time to properly review the content and ensure that it&#8217;s up to date with the final release of Rails 2.2. Some people wondered what the &#8220;Microsoft Developers&#8221; part means. Is it for people that work at Microsoft? Is it for .NET programmers? Is it for people who develop on Windows?</p>
<p>The truth is that &#8220;Microsoft Developers&#8221; is probably just a marketing term that Wrox selected as a catch-all for of the aforementioned categories of programmers. As an author I&#8217;m trying to serve all of them well, by providing a guide that sneaks in much of the Rails culture and softens the migration path by using an Operating System, and to a certain extent, tools that they&#8217;re already familiar with. In my opinion one of the major obstacles when switching to, or trying, Rails when coming from the Microsoft world, is the culture shock. The documentation and most books assume that you are familiar with *nix systems and tools, and this can be frustrating for those who are forced not only to learn a new language and framework, but also an entirely new set of tools. As it&#8217;s targeted at Microsoft developers, the book obviously makes quite a few references and comparisons to the .NET world, where they fit. This is done so that the many .NET programmers amongst the group of so called &#8220;Microsoft Developers&#8221; will find the book particularly useful. Yet the book remains generic enough so that it can be used by any programmer (particularly Windows users), even those without any knowledge of the Microsoft .NET Framework or ASP.NET.</p>
<p><strong>Python books:</strong> While on the subject of books, I wanted to mention that the final version of the <a href="http://pylonsbook.com/alpha1/toc">Pylons book</a> is available online. Despite the much less fancy UI, the book pretty much does what the <a href="http://djangobook.com/en/1.0/">Django Book</a> did in the past. And both are available in print as well (<a href="http://www.amazon.com/gp/product/1590597257?ie=UTF8&#038;tag=zenruby-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=1590597257">The Definitive Guide to Django: Web Development Done Right</a> and <a href="http://www.amazon.com/gp/product/1590599349?ie=UTF8&#038;tag=zenruby-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=1590599349">The Definitive Guide to Pylons</a>). <a href="http://pylonshq.com/">Pylons</a> is a Python web framework that can be viewed as a Ruby on Rails clone, in a far greater way than Django could ever be considered.</p>
<p>Another thing I want to mention is that I received a copy of <a href="http://www.amazon.com/gp/product/184719494X?ie=UTF8&#038;tag=zenruby-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=184719494X">Expert Python Programming</a>. I haven&#8217;t gotten to far into it yet, but from what I&#8217;ve seen so far, things look good. I hope to be able to read it through, over a weekend in the near future and then provide a proper review. Stay tuned.</p>
<p><strong>Language Popularity:</strong> If you take a look at the <a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">TIOBE Index</a>, you&#8217;ll notice a few interesting things: Ruby has dropped two positions since last year, and it&#8217;s now the 11th most popular language in the world. This shouldn&#8217;t be cause for concern though, as shown by this <a href="http://www.tiobe.com/index.php/paperinfo/tpci/Ruby.html">Ruby graph</a>. Python on the other hand is increasing in popularity and moved from the 7th to the 6th most popular language. Interestingly, according to the index (the results of which are educated guesses only), Python would seem to be more popular than C#. I find this to be true, in terms of online activity within an increasingly vibrant community, but in my opinion, the job market hasn&#8217;t caught up yet. In fact, at least in Toronto, when there&#8217;s a Python opening it&#8217;s pretty much an event that&#8217;s worthy of being discussed on the local Python mailing list. C# openings are much more common. This may be different in Silicon Valley, of course. It would also seem that Delphi has experienced a huge come back, moving from the 11th position last year to the 8th one this time around. It&#8217;s hard to imagine that Delphi has had a similar level of adoption as C# and thus has become more popular than Perl, JavaScript and Ruby. Delphi is a great solution for Win32 programming, but I don&#8217;t quite believe this overly optimistic outlook. And if this is the case, where are all the Delphi jobs and buzz?</p>
<p><strong>DB2:</strong> <a href="http://www.youtube.com/watch?v=W69zLWjpzEo">This interview</a> shows a few good reasons why even smaller and medium sized companies are increasingly adopting DB2. And while the video doesn&#8217;t mention it, IBM is coming out with <a href="http://www.ibm.com/software/data/db2/express/download.html?S_CMP=ECDDWW01&#038;S_TACT=ACDB201">an updated version of DB2 Express-C 9.5</a>. This new version, 9.5.2 or 9.5 FixPack 2, is going to introduce exciting new features, including an engine for full text search.</p>
<p><strong>The Great Ruby Shootout</strong> These days you hear a lot of talk about parallel programming. Intel <a href="http://software.intel.com/en-us/blogs/2008/10/22/sequential-programming-is-dead-so-stop-teaching-it/">promotes it</a> and despite their bias, it&#8217;s plausible that parallel programming will become important as the CPU market heads towards an increasingly larger number of cores, as opposed to focusing on the frequency of said CPUs. In the world of Ruby, this translates into <a href="http://www.igvita.com/2008/11/13/concurrency-is-a-myth-in-ruby/">multiprocessing, as opposed to multithreading</a> due to the infamous GIL (Global Interpreter Lock). This means that Ruby will most likely approach the problem similarly to how Python 2.6 did with the <a href="http://docs.python.org/dev/library/multiprocessing.html">multiprocessing module</a>, which is a process-based interface. The obvious exceptions are JRuby and IronRuby, which establish a 1 to 1 relationship between green threads and OS threads.</p>
<p>For the shootout, it would be interesting to see some multithreaded code, so as to get a better sense of how well JRuby and IronRuby compare to MRI and 1.9, when more cores are available. In fact, the long-promised shootout will be performed on a quad-core machine with 8GB of RAM. If Charles Nutter, John Lam, or any of their team members would like to contribute some programs that are able to take advantage of &#8220;native&#8221; multithreading, I&#8217;d be very happy to include them in the <a href="http://groups.google.com/group/ruby-benchmark-suite?pli=1">Ruby Benchmark Suite</a>, to be used for my shootout.</p>
<p>The repository requires some love and refactoring, since it needs to be split in two types of benchmarks. The simpler one will evaluate the execution time minus the startup time, while the more advanced benchmark will also exclude the time required for parsing and loading modules, classes and methods in the AST. It would also be nice to test each program with variable input sizes and report these results accordingly. Right now I&#8217;m very busy with the book, but as I become more available, I&#8217;ll start working on this.</p>
<p>Finally, I want to point out <a href="http://unweary.com/2008/11/specifying-performance.html">a very interesting article</a> about performance and UIs. Slow is indeed a very relative concept, and it&#8217;s important to understand how to analyze and respond to the user requirements when it comes to the responsiveness of an application as a user interacts with it.</p>
<p><strong>Hardware:</strong> I finally bought a <a href="http://www.amazon.com/gp/product/B00006B9CR?ie=UTF8&#038;tag=zenruby-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=B00006B9CR">Trackball made by Logitech</a> and the <a href="http://www.amazon.com/gp/product/B000OOY4S6?ie=UTF8&#038;tag=zenruby-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=B000OOY4S6">Microsoft Ergonomic Keyboard</a> (Microsoft makes great hardware). I don&#8217;t have wrist problems, but I&#8217;d like to see how these two affect my extensive computer usage. I plan to report my experience as soon as I&#8217;ve had a chance to use these input devices for a while, since I know this is a topic that interests lots programmers (many of whom end up being victims of <a href="http://en.wikipedia.org/wiki/Repetitive_strain_injury">RSI</a>, and some of the IRS <img src='http://programmingzen.com/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> ). I also bought <a href="http://www.amazon.com/gp/product/B000XZ79ME?ie=UTF8&#038;tag=zenruby-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=B000XZ79ME">a bad-ass color laser printer</a> which is quite handy when you&#8217;re a programmer and you are writing a book. I&#8217;ll let you know how it goes. What I didn&#8217;t buy, but still think is awesome, is the <a href="http://www.amazon.com/gp/product/B001HSOFI2?ie=UTF8&#038;tag=zenruby-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=B001HSOFI2">Flip minoHD</a>. It&#8217;s the equivalent of an iPod for the world of camcorders. $235 for a camcorder that&#8217;s so perfectly compact, and yet that can record in HD, is a pretty sweet deal. I&#8217;m considering it for Christmas, assuming it reaches Canada by then.</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://programmingzen.com/2008/11/14/merb-rails-myths-language-popularity-and-other-zenbits/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A status update</title>
		<link>http://programmingzen.com/2008/09/09/a-status-update/</link>
		<comments>http://programmingzen.com/2008/09/09/a-status-update/#comments</comments>
		<pubDate>Tue, 09 Sep 2008 18:14:12 +0000</pubDate>
		<dc:creator>Antonio Cangiano</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Ruby Benchmark Suite]]></category>
		<category><![CDATA[This Week in Ruby]]></category>

		<guid isPermaLink="false">http://antoniocangiano.com/?p=219</guid>
		<description><![CDATA[More than a month has passed since my last update. Did you miss me? I sure missed you, I truly love you guys. Jokes aside, it was rather uncharacteristic for this blog to go so long without a post, so I feel that a status update is in order before my feed ends up in [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p>More than a month has passed since my last update. Did you miss me? I sure missed you, I truly love you guys. Jokes aside, it was rather uncharacteristic for this blog to go so long without a post, so I feel that a status update is in order before my feed ends up in the Dinosaur reports of your <span class="caps">RSS</span> reader. And with humanity facing the imminent threat of the Large Hadron Collider, I didn&#8217;t want to be sucked into a black hole without saying a few last words.</p>
<p>At the beginning of August I moved from Markham to Toronto (technically North York). My wife and I were prepared for this move, so it went well. That said, there were negative aspects beyond our control.</p>
<p>The Satellite Dish installer had a few interesting discussions with our property management, and while they eventually agreed to a compromise that would preserve the holiness and virginity of my balcony, they also caused me to miss the opening ceremony of the Olympic Games. I really wanted to see the fake singing by the Chinese kid and the computer generated fireworks, but alas nothing. I consoled myself by eating dumplings a la Kung Fu Panda, minus the Kung Fu part.</p>
<p>Perhaps more devastatingly my <span class="caps">ISP</span> took its sweet time to activate my <span class="caps">DSL</span> service. And when they did, things worked on an off for all of August. When my <span class="caps">ISP</span> had problems connecting me to the tubes, I tried what any respectable geek <a href="http://xkcd.com/466/">would do</a>. Despite my impression of the Statue of Liberty, standing near the window with my laptop in hand, my attempts to freeload on Wi-Fi were futile.</p>
<p>If these disruptive happenings weren&#8217;t enough, I&#8217;ve been very busy with work and the book I&#8217;m writing (<a href="http://antoniocangiano.com/my_ruby_on_rails_book.php">Ruby on Rails for Microsoft Developers</a>). I&#8217;ve written 7 chapters so far and just passed the 300 page mark. The schedule is tight, and there is so much that I want to include, so I have to dedicate almost all of my spare time to the book. On the bright side, I think I&#8217;m going to give readers their money&#8217;s worth.</p>
<p>The direct consequence of my focus on the book is that This Week in Ruby and This Week in Rails have been interrupted. A few of you enquired about them, bringing to my attention how much you appreciated them. Unfortunately, for the next two months I won&#8217;t have time to read all the daily feeds I normally follow and come up with weekly (or bi-weekly) reports of what&#8217;s cool and worth mentioning from. My friend <a href="http://www.railsenvy.com/">Gregg Pollack</a> may take over for the Rails post that gets published on the <a href="http://weblog.rubyonrails.org">official blog</a>. Unless someone sends me a complimentary English Bulldog puppy, in which case I promise to do both reports weekly and I&#8217;ll even put your picture with a halo over your head on the sidebar of the blog.</p>
<p>Another victim of overcommitment is the (vapor)shootout. Right now I&#8217;m at full capacity and need the laptop for both work and the book, so that will have to wait. If you want to lend a hand with the project, feel free to <a href="http://groups.google.com/group/ruby-benchmark-suite">jump right in</a> though.</p>
<p>Finally, while I may not have time for the weekly reports or the shootout right now, I can still spare some time to write posts more frequently. And there is no reason not to indulge in such a rewarding activity. So expect more technical articles, especially now that there are many interesting things to talk about (Google Chrome, Django 1.0, Rails 2.2, etcetera).</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://programmingzen.com/2008/09/09/a-status-update/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

