--- layout: old_post title: RubyにCのコードを埋め込むRubyInlineが面白い permalink: /tatsuya/show/299-ruby-c-rubyinline ---

RubyInline面白い!特徴としては

ていう感じ。とりあえず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

コードが凄い気持ち悪いけど、ボトルネックのポイント・ポイントで使えば面白そう
負荷対策&高速化の対策として覚えとくと、いつか使う場所が出てくるかも。