Speeding up Ruby with Lua
Everyone knows ruby is slow. That’s why I find that the ruby community is more obsessed with optimization than any other. One of the solutions tossed around to improve the performance of ruby programs is to forgo ruby in the complex computations and switch to C.
I don’t doubt this will work. In fact, based on all the stuff I’ve read, this is really a great way to speed up your app while still using the wonder (and joy) that is ruby. However I am loathe to go back to C. I mean, the whole reason I moved to ruby was because I wanted to use a high-level language and all the cool concepts not available to lower level languages.
Enter Lua. I’ve been reading about Lua for a while now. I know it’s fast ; it’s used in WoW and a whole lot of other stuff. It’s also a high level language which I find has a lot in common with lisp (something I’ve always wanted to learn). It’s also designed to be embedded into applications; much the same way ruby was initially designed as a tool for admins. It got me thinking that maybe Lua can help me speed up Ruby.
I found a nifty little library that allows lua to be called from within ruby called rubyluabridge. I installed it on my machine and decided to run the classic fibonacci benchmark test.
Code
fib.rb
t = Time.now
def fib(n)
if n == 1 or n == 2
return 1
else
return fib(n-1) + fib(n-2)
end
end
answer = fib(ARGV[0].to_i)
puts "Answer: #{answer}"
puts "Calculation Time: #{Time.now - t}"
new_fib.rb
t = Time.now
require 'rubyluabridge'
l = Lua::State.new
l.eval <<-LUA_END
function fib(n)
if n == 1 or n == 2 then
return 1
else
return fib(n-1) + fib(n-2)
end
end
LUA_END
l.eval "answer = fib(#{ARGV[0]})"
puts "Answer: #{l.answer.to_i}"
puts "Calculation Time: #{Time.now - t}"
Here are the results:
fib.rb 20Answer: 6765 Calculation Time: 0.071339new_fib.rb 20
Answer: 6765 Calculation Time: 0.034658fib.rb 33
Answer: 3524578 Calculation Time: 11.272733new_fib.rb 33
Answer: 3524578 Calculation Time: 2.103146
Conclusion
There is definitely an improvement in the processing time of the app with lua embedded. This is more apparent the more complex the calculation.
But the most striking thing is that there is very little change in the syntax of the code. If you’ll look at the embedded lua function fib(), it is almost identical to the ruby original. We got all that speed (around 500% in this example) for code that is essentially similar. I find it looks a lot better then lisp. (parentheses anyone?)
So there you have it, embedding lua into ruby for a quick performance boost.