Inline allows you to write foreign code within your ruby code. It automatically determines if the code in question has changed and builds it only when necessary. The extensions are then automatically loaded into the class/module that defines it.
You can even write extra builders that will allow you to write inlined
code in any language. Use Inline::C
as a template and look at
Module#inline
for the required API.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
require "inline" class MyTest inline do |builder| builder.c " long factorial(int max) { int i=max, result=1; while (i >= 2) { result *= i--; } return result; }" end end factorial_5 = MyTest.new.factorial 5 |
> make bench
Running native
Type = Native , Iter = 1000000, T = 28.70058100 sec, 0.00002870 sec / iter
Running primer - preloads the compiler and stuff
With full builds
Type = Inline C , Iter = 1000000, T = 7.55118600 sec, 0.00000755 sec / iter
Type = InlineRaw, Iter = 1000000, T = 7.54488300 sec, 0.00000754 sec / iter
Type = Alias , Iter = 1000000, T = 7.53243100 sec, 0.00000753 sec / iter
Without builds
Type = Inline C , Iter = 1000000, T = 7.59543300 sec, 0.00000760 sec / iter
Type = InlineRaw, Iter = 1000000, T = 7.54097200 sec, 0.00000754 sec / iter
Type = Alias , Iter = 1000000, T = 7.53654000 sec, 0.00000754 sec / iter
gem install rubyinline
git clone git://github.com/seattlerb/rubyinline