rubyに関するmzumiのブックマーク (4)

  • FFI を使って Ruby から Rust の関数を呼び出す(その3)

    前回は、引数や戻り値について、値渡しをしたのだが、今回はポインタを使ってみる。 ポインタを使用する場合、それを表すクラスを使用するのだが、RubyRust のどちらでメモリ領域を確保したかにより、使用するクラスが異なる。 Ruby 側でアロケートしたメモリについては、FFI::MemoryPointer を使用し、Rust 側でアロケートしたメモリについては、FFI::Pointer を使用する。 FFI::MemoryPointer の場合 確保された領域については、Ruby のGC が自動で解放してくれる。 FFI::Pointer 次に、Rust 側でヒープ領域のメモリを確保し、FFI::Pointer を使用して、Ruby 側で参照してみる。 先ほどの、FFI::PointerMemory で、確保され場合と異なり、 Rust 側で確保されたメモリ領域は、GC により解放され

    mzumi
    mzumi 2016/11/15
    書いた
  • FFI を使って Ruby から Rust の関数を呼び出す(その2)

    前回は、引数も戻り値もなかったので、今回は何種類か試してみようと思う。 引数や戻り値を設定する際、Ruby 側では、下記のように引数や戻り値にそれぞれ型を定義する。 # attach_function メソッドの 第1引数が対応する関数名になる。(:perform の部分) # 第2引数の配列に、対応する関数の引数の型を定義する。(:int の部分) # 第3引数には関数の戻り値の型を定義する(:double の部分) # 下記の定義は、Rust 側の fn perform(i: i32) -> f64 という関数に対応する。 attach_function :perform, [:int], :double 設定可能な型の一覧はここに記述されている。 Rust 側では通常通りの関数の定義でOK。 プリミティブ型 まず、数値やブーリアンをいくつか引数で渡して、数値を返す様な関数を定義してみ

    mzumi
    mzumi 2016/11/04
    書いた
  • FFI を使って Ruby から Rust の関数を呼び出す

    Ruby でバッチ処理などを書いていると、処理に時間がかかってしまい、もっと速い言語で書きたい時がある。 そんな時、FFI を使うと、遅い処理部分を Rust で書くことができるということで、試してみた。 Rust まず、呼び出される側の Rustプロジェクトを作成する。 $ mkdir ffi-sample $ cd ffi-sample $ rustup override set nightly $ cago init . rust の version は nightly(2016/10/18 現在)である 1.14.0 を使用する。 lib.rs に Ruby から呼び出す関数を定義する。 今回は perform という関数を定義し、これを Ruby側から呼び出すようにする。 (内容は、「Hello, world」 を表示するだけ) 次に、Cargo.toml に下記を追加 [l

    mzumi
    mzumi 2016/10/19
    書いた
  • Inline caching in MRI

    Inline Caching Every time you call a method, Ruby must look up the method you want to call before actually calling that method. Trying to figure out what method needs to be called can be a costly operation. So one thing that virtual machine authors try to do is to speed up that process by caching the method lookup. MRI (and most other Ruby virtual machines) store this cache “inline”. Most of us kn

    mzumi
    mzumi 2015/12/24
  • 1