RubyにCのコードを埋め込むRubyInlineが面白い
04 Apr 2007RubyInline面白い!特徴としては
- CのコードをRubyへシンプルに埋め込む
- コンパイルは不要(裏でやってくれる)
- コンパイル結果はキャッシュする
- インストールはGemから
ていう感じ。とりあえず10000回加算でも試してみる、まずgemからインストール
gem install RubyInline
いつも通り完了、で使ってみる
require "rubygems"
require "inline"
class Test
inline do |builder|
builder.c <<-EOF
int plus_inline(int x, int y){
int z=0;
int a;
for(a=0; a<y; a++){
z = z + x;
}
return z;
}
EOF
end
def plus_ruby(x,y)
z = 0
y.times{
z += x
}
return z
end
end
test = Test.new
time = Time.now
p test.plus_inline(1,100000)
inline_time = Time.now - time
time = Time.now
p test.plus_ruby(1,100000)
ruby_time =Time.now - time
p ruby_time/inline_time
こんな感じで行けるらしい、凄い違和感があるけど迷わず実行
$ ruby rubyinline.rb 100000 100000 119.4128113879 $ ruby rubyinline.rb 100000 100000 170.04469273743 $ ruby rubyinline.rb 100000 100000 170.68156424581
初回で119倍!2回目以降はコンパイルがキャッシュに乗るから170倍!
コンパイルのありorなしの差が、1.7倍てのが妙に少ない気もするけどどうなんだろ?
確かに ~/.ruby_inline というディレクトリの下にキャッシュのファイルが貯まってるみたいだけど
$ cd ~/.ruby_inline/ $ ls Inline_Test_dc80.bundle Inline_Test_dc80.c
コードが凄い気持ち悪いけど、ボトルネックのポイント・ポイントで使えば面白そう
負荷対策&高速化の対策として覚えとくと、いつか使う場所が出てくるかも。
