2011-12-13 9 views
7

scalacl pluginを使用することについての問題はありますか?配列のパフォーマンス(scalaclプラグイン)を使用したスカラ操作

プロジェクトでscalaを使用する予定です。 私は実行時間を見るために少しのコードをスカラーで書いています。プラグイン

なし

(1 to 1000000).map(1 + _).sum 

1は次のようなものにコンパイルされます。

BoxesRunTime.unboxToInt(((TraversableOnce)Predef..MODULE$.intWrapper(1).to(1000000).map(new MyScala..anonfun.1(), IndexedSeq..MODULE$.canBuildFrom())).sum(Numeric.IntIsIntegral..MODULE$)); 

とscalaclプラグインで約375ミリ秒

2.

で実行されます
int i = 1; 
int j = 1000000; 
int k = j; 
int m = i; 
for (VectorBuilder localVectorBuilder = new VectorBuilder(); m <= k;) { 
    int n = m; 
    localVectorBuilder.$plus$eq(BoxesRunTime.boxToInteger(1 + n)); 
    m += 1; 
} 
int a = BoxesRunTime.unboxToInt(localVectorBuilder.result().sum(Numeric.IntIsIntegral..MODULE$)); 

259ミリ

私は考えることができる
+2

30%の改善はあまりありません。私は現在、アレイとwhileループを使用している私のコードの一部を最適化し、100倍のスピードアップを実現しました。慣習的なScalaは本当に遅くなる可能性があります。例えば、あなたがボクシングを取り除く場合、あなたはより印象的な何かを得るでしょう。 – ziggystar

+0

Btw、 'Range#sum'はトランク内で最適化され、線形' O(n) 'の代わりに一定時間' O(n) 'で実行されます。ほとんどの場合、アルゴリズムの改善が望ましい。 – soc

答えて

10

可能短所:

1)ループの最適化が動作するように表示され、開発者は非常に有能なようだが、それは「についてScalaCL」画面に太字で述べています " ScalaCLは本番環境ではありません! "つまり、バグや不安定性が導入される可能性が少しあります。

2)毎回プラグインを使用してコンパイルすることを忘れないでください。プラグインが中長期的にメンテナンス/互換性があることを確認してください

3)効率的ではないコードを書くことができますが、ボトルネックを特定し手作業で最適化すればコードが高速になる可能性がありますつまり、実際には「亀裂の上の紙」

4)それは余分なライブラリの依存性であり、ビルドファイルを複雑にします

あなたは短所を求めましたが、これはそのプロと比較してかなり小さいです。個人的には、個人的なプロジェクトにループ最適化を使用することについては心配する必要はありません。 (私はそれらを試してみましたが、自分のGPUが私のCPUよりも少し遅かった - obvは利用可能なハードウェアに依存していました)、しかし、私はこのプロジェクトが独自のものであろうと、標準のコンパイラとライブラリ。いくつかのコードでは、非常に劇的なスピードアップ(最大20倍速く)が見られました。