RubyはCプログラミング言語と非常に簡単に統合でき、Rubyの拡張機能を作成できます。 または、Cライブラリのラッパーを作成し、通常のRubyライブラリのように使用できます。 また、RubyコードでCにクリティカルコンピューティングを直接実装することもできます。 別の統合オプションは、C / C ++プログラムでRubyをスクリプト言語として使用することです。 たとえば、Google SketchUpでの実行方法。
Cと統合するためのRubyの機能を見てみましょう。
プログラムにボトルネックがあります。たとえば、ループで実行されるコンピューティングの一部です。 これらの計算により、アプリケーションのパフォーマンスが大幅に低下します。
解決策は、重要な部分をCに書き換えることです。 コンパイルされた言語は、解釈された言語よりも明らかに高速です。
ここには、Rubyの拡張機能を作成するか、Rubyから直接Cコードを使用するかの2つのオプションがあります。
まず、2番目のオプションを選択します。RubyInlineライブラリがこれを支援します。
数を素数に分解する方法があるとします。 最も簡単な方法で、反復アルゴリズムを使用してこのメソッドを実装しましょう。
クラスファクター
#num-入力番号、show-結果を画面に表示するかどうか
def分解num、show = false
num1 = num
n = 2#2から除数の検索を開始
一方、n * n <= num1
if num%n == 0#現在の数が除数の場合、それを出力
num = num / n
表示する場合はnを入れます
そうでない場合は#現在の数を増やす
n + = 1
終わり
終わり
終わり
終わり
しかし、このメソッドの速度に満足していないため、RubyInlineライブラリを使用してCで書き換えます。
まず、インストールします:
gem install RubyInline
RubyInlineにはPOSIXシステム、つまり* nixまたはWindows上のCygwinが必要です。
C / C ++コンパイラと同様に。
簡単な使用例:
「rubygems」が必要
require 'inline'#RubyInlineに接続
クラステスト
#埋め込みコードハンドラー
インラインdo |ビルダー| #インライン:: Cクラスオブジェクトがブロックに渡される
builder.c '
static char * test(){
return "C from Hi!:)";
}
''
終わり
終わり
Test.new.test#puts "Hi from C!:)"
サンプルコードでは、hello文字列を返す小さなCメソッドを作成しました。
方法
c
は次のことを行います。
-引数の型と戻り値をCからRubyに変換します
-メソッドコードで行をコンパイルします
-テストメソッドをテストクラスに追加します
その後、
test
を通常のRubyメソッドとして使用できます。
分解に戻りましょう。 分解方法をRubyInlineで書き換えます。
「rubygems」が必要
「インライン」が必要
クラスFastFactor
インラインdo |ビルダー|
builder.c '
静的ボイド分解(int num、int show){
int i = 0;
int num1 = num;
int n = 2;
while(n * n <= num1){
if(num%n == 0){
num = num / n;
if(表示)
printf( "%d \ n"、n);
i ++;
} else {
n ++;
}
}
}
''
終わり
終わり
そして今、最も興味深い。 パフォーマンステスト。
Rubyテストの実装:
f = Factor.new
1000.times {f.factorization 999999}
結果:
$ time ruby factor.rb
実数0m1.034s
ユーザー0m1.028s
sys 0m0.004s
Cと同様:
f = FastFactor.new
1000.times {f.factorization 999999、false}
そして結果:
時間ruby factorfast.rb
実際の0m0.116s
ユーザー0m0.092s
sys 0m0.024s
テストからわかるように、RubyInlineを使用すると、重要なコードを約10倍高速化できます。
テストコード:
factor.rb 、
factorfast.rb要約すると、アプリケーションが負荷に対応していない場合、Cで重要なポイントを実装することで常に高速化できると言えます。幸いなことに、Rubyは強力で便利な手段を提供します。
次のパートでは、Ruby用のC拡張機能の作成について説明します。
関連リンク:
RubyInline:
http ://rubyforge.org/projects/rubyinline/
ドキュメント:
http :
//rubyinline.rubyforge.org/RubyInline/