2011-08-02 13 views
9

私は入力としてObject型をとるインタフェースを扱っています。これは、私が時にはインタフェースを通って渡す必要のある原始的なデータを持っているので、私にとっては残念です。これはもちろん私を箱に強制します。単一要素のプリミティブ配列を渡してボクシングを避ける

プロファイリングでは、この領域がコード内のホットスポットとなっています。私はこうしてこの領域をより速くするための選択肢を模索しています。

私は今日、静的なプリミティブ配列を事前に割り当てて、これにプリミティブな値を格納してから、配列を渡します(そして、インタフェースの実装では、配列。

これをテストするためにいくつかのコードを書いていますが、合理的に高い値(1000万)では、配列メソッドが非常に高速になっていることがわかります。テストの反復回数を増やすと、

これまでにこのアプローチについて誰かが考えていたのか、これをベンチマークする方法についての提案があるのでしょうか。

コード例:

Double data = Double.valueOf(VALUE); 
inst.interface(data); 
//inside interface(Object object)... 
Double data = (Double) object; 
double d = data.value(); 

対...

doublearray[0] = VALUE; 
inst.interface(data); 
//inside interface(Object object)... 
double[] data = (double[]) object; 
double d = data[0]; 

ありがとう! RB

+0

なぜグローバルな 'double'変数がないのですか? – irreputable

答えて

1

1つのオブジェクトのみを使用すると、valueOf()がいくつかの値のために最適化されていても、autoboxingに1を割り当てなければならない回数に対する、これまで(配列)に割り当てられているように私は、配列のオプションとなるだろう。

+0

私のテストでは、アレイ技術がより速いオーダーであることがわかりました!私はそれが少なくとも競争力があると思ったが、これは私が予想した以上に大きかった。 – user321605

1

シングルエレメントアレイとオートボクシングの主な違いは、アレイが変更可能であることです。これは場合によってはうまくいく場合もあれば悪い場合もあります。配列を変更可能にすると、同じ配列を再利用して配列の内容を読み出すメソッドに異なる変数を渡しても、参照は保持されない場合には、パフォーマンスが向上します。しかし、コードがその値を保持するために配列の1つへの参照を保持し、他のコードが配列に格納されている値を変更すると、見つけにくいさまざまなバグにつながる可能性があります。

関連する問題