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/