RubyとC。パート1。

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.rbfactorfast.rb

要約すると、アプリケーションが負荷に対応していない場合、Cで重要なポイントを実装することで常に高速化できると言えます。幸いなことに、Rubyは強力で便利な手段を提供します。



次のパートでは、Ruby用のC拡張機能の作成について説明します。



関連リンク:

RubyInline: http ://rubyforge.org/projects/rubyinline/

ドキュメント: http : //rubyinline.rubyforge.org/RubyInline/




All Articles