単純なllvm / libjitテストパートIII、今もオウム
 この記事は記事の続きです: 
      
        
        
        
      
      簡単なテストlibjitとllvm 
      
        
        
        
      
      シンプルなテストllvm / libjitパートII、同じ+ gnu稲妻 。 
      
        
        
        
      
    
      
        
        
        
      
     入門カード 
      
        
        
        
      
    
      
        
        
        
      
     以前の記事では、エラトステインのふるいの例を使用して、llvm、libjit、およびgnu lightningのパフォーマンスを調べました。 検討されるすべてのオプションは、発射速度が良好な低レベルのライブラリですが、本質的に特殊なアセンブラーであり、たとえば、文字列を使用した作業を自分で実装する必要があります。 
      
        
        
        
      
    
      
        
        
        
      
      DSLのバックエンドとしてプログラムに含めることができる他の仮想マシンがあります。 たとえば、 
エイプリルフールのジョークから生まれた
オウム -未来の真珠の基礎。 
      
        
        
        
      
    
      
        
        
        
      
     文字列、ハッシュテーブル、無次元配列、ガベージコレクション、コンソールおよびファイルI / O、その他の便利な機能など、さらに多くの機能があります。 質問-これらのすてきな追加すべての価格(パフォーマンスの低下)は? 
      
        
        
        
      
    
      
        
        
        
      
     やってみましょう。 
      
        
        
        
      
    
      
        
        
        
      
     オウムのエラトステネスふるい 
      
        
        
        
      
    
      
        
        
        
      
     前と同様に、これらは2つの手順であり、そのうちの1つ(エラト)はアルゴリズム自体を実装し、2つ目(メイン)は1〜50_000の素数を検索するために100_000回エラトを開始します。 
      
        
        
        
      
    
      
        
        
        
      
     .loadlib 'trans_ops' 
      
        
        
        
      
     .loadlib 'math_ops' 
      
        
        
        
      
     
      
        
        
        
      
     .sub 'erato' 
      
        
        
        
      
     .param int n 
      
        
        
        
      
     $P0 = new 'ResizableIntegerArray' # a = P0 
      
        
        
        
      
     $P0 = n 
      
        
        
        
      
     $N0 = sqrt n # q = I0 
      
        
        
        
      
     $I0 = floor $N0 # i = I1 
      
        
        
        
      
     $I1 = 2 
      
        
        
        
      
     for_cond: 
      
        
        
        
      
     if $I1 > $I0 goto for_end 
      
        
        
        
      
     $I2 = $P0[$I1] 
      
        
        
        
      
     if $I2 == 1 goto end_if 
      
        
        
        
      
     $I3 = $I1 * $I1 # j = I3 
      
        
        
        
      
     while_cond: 
      
        
        
        
      
     if $I3 > n goto while_end 
      
        
        
        
      
     $P0[$I3] = 1 
      
        
        
        
      
     $I3 += $I1 
      
        
        
        
      
     goto while_cond 
      
        
        
        
      
     while_end: 
      
        
        
        
      
     end_if: 
      
        
        
        
      
     $I1 += 1 
      
        
        
        
      
     goto for_cond 
      
        
        
        
      
     for_end: 
      
        
        
        
      
     .end 
      
        
        
        
      
     
      
        
        
        
      
     .sub main :main 
      
        
        
        
      
     $I10 = 0 
      
        
        
        
      
     for_test1: 
      
        
        
        
      
     if $I0>100000 goto for_end1 
      
        
        
        
      
     erato(50000) 
      
        
        
        
      
     $I0 += 1 
      
        
        
        
      
     goto for_test1 
      
        
        
        
      
     for_end1: 
      
        
        
        
      
     .end 
      
        
        
        
      
     
      
        
        
        
      
    
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      
        
        
        
      
    
      
        
        
        
      
     そして-これをすべて実行する制御プログラム: 
      
        
        
        
      
    
      
        
        
        
      
     001 : #include <parrot/embed.h> 
      
        
        
        
      
     002: #include <parrot/extend.h> 
      
        
        
        
      
     003: 
      
        
        
        
      
     004: int main ( int argc, char * argv[]) 
      
        
        
        
      
     005: { 
      
        
        
        
      
     006: Parrot_Interp interp; 
      
        
        
        
      
     007: Parrot_PackFile pf; 
      
        
        
        
      
     008: 
      
        
        
        
      
     009: interp = Parrot_new( NULL ); 
      
        
        
        
      
     010: if ( ! interp) { 
      
        
        
        
      
     011: return 1 ; 
      
        
        
        
      
     012: } 
      
        
        
        
      
     013: 
      
        
        
        
      
     014: pf = Parrot_pbc_read(interp, "erato.pbc" , 0 ); 
      
        
        
        
      
     015: Parrot_pbc_load(interp, pf); 
      
        
        
        
      
     016: Parrot_runcode(interp, argc, argv); 
      
        
        
        
      
     017: 
      
        
        
        
      
     018: Parrot_destroy(interp); 
      
        
        
        
      
     019: 
      
        
        
        
      
     020: return 0 ; 
      
        
        
        
      
     021: } 
      
        
        
        
      
     022:
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
 
      
        
        
        
      
    
      
        
        
        
      
     したがって、新しいオプションをコンパイルします。 
      
        
        
        
      
     parrot -o erato.pbc erato.ptr 
      
        
        
        
      
     gcc -O2 erato.c -I /usr/include/parrot/2.0.0/ -lparrot -o erato 
      
        
        
        
      
    
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      
        
        
        
      
     そして起動: 
      
        
        
        
      
     /usr/bin/time -f "%U" ./erato 
      
        
        
        
      
     2361.2 
      
        
        
        
      
    
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     
      
        
        
        
      
     著者の思考運動の産物と成果 
      
        
        
        
      
     合計、テーブルは次の形式を取ります。 
      
        
        
        
      
    
      
        
        
        
      
    |   VM  |  秒単位の実行時間(少ない=良い)  | 
|---|
|   LLVM  |   13.77  | 
|---|
|  リブジット  |   14.17  | 
|---|
|   GNUライトニング  |   32.59  | 
|---|
|  パロット  |   2361  | 
|---|
|  そして情報だけのために:  | 
|   gcc -O0  |   50.09  | 
|---|
|   gcc -O1  |   13.79  | 
|---|
|  同様のperlプログラム  |   4288  | 
|---|
      
        
        
        
      
    
      
        
        
        
      
     つまり、この例では、parrot仮想マシンの実行速度はjitマシンの150倍です。 ただし、pearlプログラムの2倍の速度です。 これは実際には良いニュースです。オウムをベースにした真珠の次のバージョンは今日よりも速く動作するようです...しかし、オウムは明らかに速度が必要な場合に考慮される他のマシンの代替品ではありません。 
      
        
        
        
      
    
      
        
        
        
      
     最終和音 
      
        
        
        
      
    
      
        
        
        
      
     一般に、オウムは非常に心地よい印象を残し、すべてが説明どおりに機能し、落とし穴はなく、可能性は海であり、ドキュメントは良好です。  llvmの後にそれを書くことは喜びです。 それで
、私自身のために、私は次の推奨事項を作りました。 
      
        
        
        
      
    
      
        
        
        
      
    -  速度が必要-llvmまたはlibjit、llvmが望ましい(より良いインフラストラクチャ、より多くのツール) 
 -  メモリ不足やディスク容量などのcr屈な状態-gnu稲妻; 
 -  速度はそれほど重要ではないが、利便性が必要な場合、文字列または複雑な構造で作業する-オウム 
 
 
      
        
        
        
      
    
All Articles