http://on-ruby.blogspot.com/2006/07/rubyinline-making-making-things-faster.html
C 코드를 Ruby에 inlining하는 방법입니다. 먼저 inline gem 설치.
mkseo@mkseo:~/tmp$ sudo gem install rubyinline Attempting local installation of 'rubyinline' Local gem file not found: rubyinline*.gem Attempting remote installation of 'rubyinline' Successfully installed RubyInline-3.5.0 mkseo@mkseo:~/tmp$
테스트 코드.
require “rubygems”
require “inline”
class RubyInlinePrime
inline do |builder|
builder.c ”
int prime(int n)
{
int x;
if (n == 2) return 1;
for (x = 2; x < n - 1; x++)
if (n % x == 0) return x;
return 1;
}"
end
end
class RubyNativePrime
def prime(n)
return 1 if n == 2
for x in (2..n-1)
return x if n % x == 0
end
return 1;
end
end
ruby_time = Time.now
nav_prime = RubyNativePrime.new
2.upto(10000) do |i|
if nav_prime.prime(i) != 1
puts "#{i} is #{nav_prime.prime(i)} * #{i / nav_prime.prime(i)}"
else
puts "#{i} is a prime number."
end
end
ruby_time = Time.now - ruby_time
c_time = Time.now
c_prime = RubyInlinePrime.new
2.upto(10000) do |i|
if c_prime.prime(i) != 1
puts "#{i} is #{c_prime.prime(i)} * #{i / c_prime.prime(i)}"
else
puts "#{i} is a prime number."
end
end
c_time = Time.now - c_time
puts "Ruby: #{ruby_time}"
puts "Inlining C: #{c_time}"
[/code]
실행 결과
[code]
mkseo@mkseo:~/tmp$ ruby test_inline.rb | tail
9993 is 3 * 3331
9994 is 2 * 4997
9995 is 5 * 1999
9996 is 2 * 4998
9997 is 13 * 769
9998 is 2 * 4999
9999 is 3 * 3333
10000 is 2 * 5000
Ruby: 13.717828
Inlining C: 0.301906
mkseo@mkseo:~/tmp$
[/code]
물론 루비를 먼저 실행하냐, C를 먼저 실행하냐, 몇번 반복하냐 등에 따라 실험결과는 달라지지만 13.7초 vs 0.3 초는 이런 비난이 가해질 수 없는 성능 차. 사실 저도 최근에 루비로 된 코드를 C++로 포팅한뒤 33배 성능이 향상되는 바람에 루비에 좌절.
루비가 최근 작은 사이즈에서는 does not scale well 이라는 말이 나오는데 근거 없는 말이 절대로 아님.. CPU Intesive 한 경우에는 이런 극적인 차가 더 잘 드러납니다. 그러니까, Ruby off the rails sucks?