Pull to refresh

Ruby inline

Reading time1 min
Views856
Сегодня понадобилось добавить в проект на Ruby небольшую «числодробилку». Быстро реализовал код, протестировал, но ужаснулся производительности. Вспомнил о модуле inline. Смысл которого заключается в компиляции C кода, и динамическому подключении его к Ruby программе. Происходит это прозрачно.
Для этого необходимо установить библиотеку:
Debian-way:
apt-get install libinline-ruby

RubyGem:
gem install rubyinline

Покажу на примере чисел Фибоначчи:

#!/usr/bin/ruby -w

require 'rubygems'
require 'inline'
require 'benchmark'

class Example
def fib(n)
curr = 0
succ = 1
n.times do |i|
curr, succ = succ, curr + succ
end
return curr
end

inline(:C) do |builder|
builder.c "
unsigned long fastfib(unsigned long n)
{
unsigned int n0 = 0;
unsigned int n1 = 1;
unsigned int naux;
unsigned int i;
if (n == 0)
return 0;
for (i=0; i < n-1; i++) {
naux = n1;
n1 = n0 + n1;
n0 = naux;
}
return n1;
}
"
end
end

t=Example.new;

puts Benchmark.measure {
40.times do |i|
t.fib i
end
}

puts Benchmark.measure {
40.times do |i|
t.fastfib i
end
}

Результат на лицо:

0.000000 0.000000 0.000000 ( 0.001326)
0.000000 0.000000 0.000000 ( 0.000075)


Конечно, используя inline-компиляцию самый первый запуск будет более длительным — в дальнейшем код кешируется

PS: перенесите в Ruby блог
Tags:
Hubs:
Total votes 14: ↑11 and ↓3+8
Comments1

Articles