SSブログ
English Version

独自言語 picle のコンパイラ化(その9) [PIC]

 picle コンパイラができてきたのでマイクロチップ社の xc16 コンパイラとの速度比較を行ってみました。
 ベンチマークプログラムとして「独自言語 picle のコンパイラ化(その5)」で picleインタープリタとコンパイラの速度比較で使用した素数を求めるプログラムを使い、5000 以下の素数を求める時間を比較してみました。

 結果から言うと下表のように picle の処理時間と xc16 の最適化レベル毎の処理時間比は 約1.6倍(最適化レベル:0)、約2.1倍(最適化レベル:1)でした。
 処理時間は picle に実装している 10ms 毎にディクリメントされる Timer_ 変数を用いて測定しました。

xc16 picle rate
optimize:03240 ms5280 ms1.63
optimize:12550 ms5280 ms2.07


 picle側は局所的な最適化しかしていないのでまぁこんなものだと思います。でもコンパイル+フラッシュ書込みの時間は xc16 より二桁倍以上速い(^^)
 picle側が遅い主な要因は下記内容であると考えられます(いずれも最適化検討段階で気づいていたことではありますが・・)
  1. 比較演算子の処理
    picleは比較演算子の演算結果として論理値(0/1)まで計算してから分岐判断しているが、xc16 は両辺の差分計算後、ステータスのフラグ状態により分岐している。

  2. インクリメント演算子
    xc16 はインクリメントでは inc命令、プラス2では inc2命令を使っているが picle はそもそもインクリメント演算子に対応しておらず、他の足し算と同様に計算している。

  3. for文の展開
    picleではループ内に 条件ジャンプと無条件ジャンプの二つのジャンプ命令が使われるが、xc16 では条件ジャンプのみ使っている。


素数プログラム(xc16)
#include <xc.h>

int Cnt;

void ans( int n );

int __attribute__ ((address(0x9030))) prime( int max )
{
    int i,j;
    Cnt = 0;
    if( max > 1 ) {
        ans( 2 );
    }
    for( i = 3 ; i <= max ; i += 2 ) {
        for( j = 2 ; j < i ; j++ ) {
            if( i % j == 0 ) {
                j = i + 1;
            }
        }
        if( j == i ) {
            ans( i );
        }
    }
    return( Cnt );
}


void ans( int n )
{
    Cnt++;
}


int main()
{
    prime( 0 );
    return( 0 );
}



素数プログラム(picle)
:l
   1:# sosuu
   2:
   3:
   4:var Cnt;
   5:
   6:func prime( max ) = $9030;
   7:
   8:proc ans(n) {
   9:   Cnt = Cnt + 1;
  10:#  PrnStr_("\nNo");
  11:#  PrnDecF_(Cnt,3);
  12:#  PrnChar_(':');
  13:#  PrnDecF_(n,4);
  14:}
  15:
  16:
  17:proc main() {
  18:   var i,j,max;
  19:   PrnStr_("\ninput Max:");
  20:   max=Input_();
  21:   Timer_ = 32000;
  22:   Cnt=0;
  23:   if (max>1) {
  24:           ans(2);
  25:   }
  26:   for (i=3;i<=max;i=i+2) {
  27:           for (j=2;j<i;j=j+1) {
  28:                   if (i%j=0) {
  29:                           j=i+1;
  30:                   }
  31:           }
  32:           if (j=i) {
  33:                   ans(i);
  34:           }
  35:   }
  36:   PrnStr_( "¥nAnswer is " );
  37:   PrnDec_( Cnt );
  38:   PrnStr_( "¥npicle time[ms] : " );
  39:   PrnDec_( (32000 - Timer_) * 10 );
  40:   Timer_ = 32000;
  41:   PrnStr_( "¥nAnswer is " );
  42:   PrnDec_( prime( max ) );
  43:   PrnStr_( "¥nxc16  time[ms] : " );
  44:   PrnDec_( (32000 - Timer_) * 10 );
  45:}
:run

input Max:5000
Answer is 669
picle time[ms] : 5280
Answer is 669
xc16  time[ms] : 3240
:



[TOP] [ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(0)  トラックバック(3) 
共通テーマ:趣味・カルチャー

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 3