Using RubyInline to Speed Up Code By 10x
After writing a basic routine to print all prime numbers between 1 and 10,000 in Ruby, Pat Eyler found it took almost 3 seconds to complete, and seeked out a way to make it faster. Enter RubyInline (covered previous at RubyInside).. With RubyInline he added a basic C function into the Ruby mix and knocked down the time required to 0.3 seconds.
The code:
require "rubygems" require "inline" class Primes inline do |builder| builder.c ' int prime(int num) { int x; for (x = 2; x < (num - 1) ; x++) { if (num == 2) { return 1; } if (num % x == 0) { return x; } } return 1; }' end end p = Primes.new for num in 2..10_000 do is_prime = p.prime(num) if is_prime == 1 puts "#{num} is a prime number" else puts "#{num} equals #{is_prime} * #{num/is_prime}" end end
Read more.. (found via ozmm)
July 27, 2006 at 12:29 pm
Ahem...
"seeked" => sought
July 28, 2006 at 3:46 am
I dunno if ZenSpider is still working on this or not, but it presents an even better sort of solution: http://www.zenspider.com/ZSS/Products/RubyInline/index.html
July 28, 2006 at 11:08 pm
Umm, Danno, I used zenspiders RubyInline to do this, so I'm not sure you can call it better. ;^)
September 3, 2006 at 3:50 pm
While I realize that the author was working under the constraint of "someone forced me to use this algorithm to keep things consistent", this is an agonizing example of "optimize the algorithm, not the implementation." Instead of using C, a complex package that shells out to gcc, and writing code that's 3x longer than it needs to be, rewriting the algorithm to use the Sieve -- in pure ruby -- takes the runtime down to 0.1 seconds (1/3rd of the time required by the Inline C version):
http://dga.livejournal.com/22232.html
Let's stomp out this terrible, terrible example and not leave the net scattered with bad examples of optimizing the wrong way.