Ruby Go Zoom Zoom
Published 2005-04-29 @ 19:33
Tagged ruby, parsetree, ruby2c, rubyinline, toys
(please mazda do not sue me)
Everyone knows that ruby isn’t fast. (no, it isn’t deja-vu–read on) Its true, Ruby isn’t fast. Matz himself gave a keynote at the Seattle RubyConf titled something like “Ruby: Fast, but Good” (please send me corrections if I misremember).
So, yeah. Slow. “Cool,” I say, “most of the time it is fast enough”. When it isn’t fast enough what you (should) do is:
Exhaust all pure-ruby options:
- Think about your design and make sure it is correct/optimal.
- Look into trading off memory for speed (ie, caching like mad).
Double check to see if someone else has already solved your problem, etc etc.
- Profile your code
- Identify and possibly refactor bottlenecks into bite sized chunks.
- Rewrite the bottlenecks in C.
If you are lazy (smart?? nah…) like me, you’ll use RubyInline to cut your C development time to a minimum… Most of the time, this isn’t too hard, and if you use RubyInline, then you don’t really spend any extra time dealing with makefiles/extconfs/setups/etc.
% time ruby factorial.rb 5000000 Iter = 5000000, T = 67.23166600 sec, 0.00001345 sec / iter real 1m7.310s user 0m55.980s sys 0m0.280s
That is not a terribly long time to be running, but factorial??? c’mon. It shouldn’t be that slow for just 5 million calls! If we ran a profiler on the code, we’d see that in fact, the method factorial is where nearly all time is being spent. We could pop in a quick call to inline and convert it to C and ZOOOOM!
But… what if you didn’t have to write C code???
What if… all you had to do was add
-rzenoptimize to the command-line??
% time ruby -rzenoptimize factorial.rb 5000000 *** Optimizer threshold tripped!! Optimizing Factorial.factorial Iter = 5000000, T = 13.30087900 sec, 0.00000266 sec / iter real 0m14.382s user 0m12.550s sys 0m0.290s
And ZOOM! is automatic reducing your runtime from 67 seconds to 14 seconds, almost a 5x increase in speed. Wouldn’t that be nice? What if you could do that???
What if… I told you that I didn’t type that output, I copied and pasted it?