Ruby Shootout: Fasta
Lately, I’ve been looking at the shootout Ruby benchmarks. I’d gotten into a habit of checking them every few months, rooting for my favorite languages. Not really understanding why some didn’t have the greatest showing on there. When the people running it upgraded their hardware, it seems as though Ruby fell off the list. While Ruby is a slow language, it deserves its spot (even if it is the bottom). I looked at the submissions and saw a post saying if more Ruby benchmarks were updated it would be included again.
I’ve since updated 3 of the benchmarks; I sped up reverse-compliment to be 2x faster than the previous. I’m not a Ruby expert by any means, but I was able to get a speedup. I don’t know if the other languages are in the same state, but they may be…
Anyway, the Fasta benchmark is the one that I most recently updated. It took me a while to get a decent speedup. It turned out the Array#find is slower than Array#each with a break statement. Making this switch is what got the biggest speedup out of the program.
I wrote a benchmark showing the difference in runtime:
require 'benchmark' N = 300 table = (0..300).to_a Benchmark.bmbm(8) do |x| x.report("Array.find") { N.times do table.each do |find_num| table.find do |num| num > find_num end end end } x.report("Array.each") { N.times do table.each do |find_num| output = nil table.each do |num| if num > find_num then output = num break end end end end } end |
The results:
Ruby 1.8.6 user system total real Array.find 12.120000 0.020000 12.140000 ( 14.647705) Array.each 8.150000 0.030000 8.180000 ( 9.734463) JRuby 1.1.4 user system total real Array.find 6.738000 0.000000 6.738000 ( 6.738407) Array.each 5.365000 0.000000 5.365000 ( 5.364320)
Now, I’m running this on an admittedly dated machine. Again, I’m nowhere near a ruby expert, so if someone sees a way to make the benchmark more fair let me know, and I’ll update it. I can’t say anything about how this would run in YARV when that is released.
Here is a link to the Ruby Fasta benchmark on the Language Shootout:
In: Ruby · Tagged with: benchmarks, optimization, shootout
on May 2, 2009 at 5:13 pm
Permalink
> When the people running it upgraded their hardware, it seems as though Ruby fell off the list.
Purely a coincidence but Ruby fell back on the list 2 days after you blogged – Tue Nov 4 23:15:02 2008 UTC
> but I was able to get a speedup
If you have better programs contribute them –
http://shootout.alioth.debian.org/u32q/faq.php#play
on May 2, 2009 at 6:45 pm
Permalink
> Purely a coincidence but Ruby fell back on the list 2 days after you blogged – Tue Nov 4 23:15:02 2008 UTC
Yes, purely coincidence. ;) I think submitting 3 updated benchmarks had more to do with getting it back on the list than anything else. YARV being officially released probably helped secure it a spot on the list too. I may pick it up again in the future, but with each update finding improvements becomes harder…
on August 7, 2009 at 12:58 pm
Permalink
It was purely a coincidence – as well as a hardware upgrade there was switch to Ubuntu, and Ruby in the distro didn’t seem to work so wasn’t measured. After I’d sorted out all the other issues I went back and figured out how to get Ruby working.