Ruby拡張ライブラリを作る TA小話 2013 05 24

10 

Loading....

Loading....

Loading....

Loading....

Loading....

全文

(1)

TA小話

〜Ruby拡張ライブラリを作る〜

東大 数理 M1 45-136035

(2)

モチベーション

Ruby(スクリプト言語)の特徴

長所:小回りが効く。 短所:計算が遅い。

C言語の特徴

長所:計算が速い。 短所:色々と重い。

(3)

2つの解決策

標準出力によるやりとり

パイプなどを用いてデータをプログラム間で受け渡しをする。 愚直でシンプルだし汎用性もあるが、標準出力を読み込む部 分をいちいち記述するのは結構面倒。

拡張ライブラリを自作

C言語を用いてRubyの関数を記述する。

(4)

実際にやってみた

どれくらいの速さなのかを比較実験した。

同一のアルゴリズムを複数の言語で実行し

て時間を計測する。

それぞれの言語に対する最適化などについ

(5)

プログラム・実行・計測

Newton法で1から99999までの平方根を求める

プログラムを作成した。

プログラムはrootを計算する関数の部分と1から

99999までの数字をその関数に代入するメインの

部分に分けた。

特に、拡張ライブラリについては、関数部分をC言語

で記述し、メインの部分をRubyで記述した。

コンパイラなどはもともとパソコンにダウンロードし

(6)

結果

Ruby+C

Ruby

C

D

Java

0.12s

5.15s

0.05s

0.10s

0.16s

D言語やJavaと同様

(7)

注意

今回はRubyを用いたが、勿論、Pythonなどの他

のスクリプト言語でも同様のことができる。(はず)

今回は条件を揃えるためにコピペで実験を行った

(8)

roottest.c その1

#include <ruby.h>

double preroot(double n){ double x,d;

int i;

x = n / 2; d = 100;

while(d > n * 1.0e-15){

x = x - (x*x - n) / (2*x); d = x * x - n;

if(d < 0) d = - d; }

return x;

(9)

roottest.c その2

VALUE root(VALUE self,VALUE y){ double n = NUM2DBL(y);

n = preroot(n);

return rb_float_new(n);

}

void Init_Root(void){ VALUE rb_mRoot;

rb_mRoot = rb_define_module("Root");

(10)

test.rb

re

q

uire

"

Root.so

"

include(Root)

Updating...

参照

Updating...

関連した話題 :