2016-06-02 10 views
0

私は、ポイントの(x、y)座標を格納するためにdouble値のスタックを使用する、パフォーマンスクリティカルなメソッドをJavaで作成しています。現時点ではStack<Double>を使用していますが、オートボックスのコストが原因でパフォーマンスに問題が生じることがあります。座標は通常呼び出し間で変化します。そのため、Doubleラッパーをキャッシュすることは役に立ちません。効率的なスタックの代替<Double>

したがって、私は仮想クラスを探していますが、DoubleStackと呼びましょう。振る舞いとインターフェイスはStack<T>に似ていますが、プリミティブでのみ動作します。そのような振る舞いを持つクラスがありますか、それとももっと良いのですが、リスト、スタック、キューなどの一般的なコンテナの代替案を格納するプライマリからなるライブラリですか?

+4

スタックはアルゴリズムの適切なデータ構造ですか?その場合は、スタックがパフォーマンスのボトルネックであるという堅い証拠がなくなるまで、可能なパフォーマンスの問題を無視してください。パフォーマンスに問題がある場合は、コードをプロファイリングして、プロファイラが遅いと言う領域に投資する必要があります。あなたが今やっていることは[未熟な最適化](https://en.wikipedia.org/wiki/Program_optimization#When_to_optimize)です。 –

+2

スタックが実際にパフォーマンスのボトルネックになっている場合は、 'double []'に基づいて独自のデータ構造を簡単に実装できると思います。必要なコード量はそれほど多くはありません。特に、 'Stack 'のすべてのインターフェースを実装する必要がない場合は、Jimの推奨に従うことをお勧めします。 – Aaron

+1

"java primitive collection"を検索するには、あなたの検索エンジンを使用してください。これを行う図書館があります。 –

答えて

0

私は時期尚早の最適化についてのコメントに同意するが、ちょうどそれの楽しみのために、ここでは些細なDoubleStackの実装です:

public class HeresYourDoubleStack { 
    private int size = 0; 
    private double[] values= new double[16]; 

    public int size() { 
    return size; 
    } 

    public double pop() { 
    if(size==0)throw new NoSuchElementException(); 
    return values[size--]; 
    } 

    public void push(double value) { 
    resizeIfNecessary(); 
    values[size++]=value; 
    } 

    private void resizeIfNecessary() { 
    if(values.length==size){ 
     double[] tmp = new double[size * 2]; 
     System.arraycopy(values,0,tmp,0,size); 
     values=tmp; 
    } 
    } 
} 

テストされていない、と確かにスレッドセーフではありません。

0

プリミティブ型のデータ構造を提供するライブラリがいくつかあります。 例はFastUtilで、これはあなたが望むものを正確に行うクラスDoubleStackを提供します。 代替案は、TDoubleStackというクラスを提供するTrove4Jかもしれません。他のライブラリもありますが、私が協力している2つの言及があります。

Trove4Jは長い間標準のようなものでしたが、多くの更新プログラムを入手していないようですが、FastUtilはより積極的に開発されているようです。また、いくつかの私の(バイアスされた?)テストでは、FastUtilは多くの場合高速でしたが、私は主にStacksではなくMapsをテストしました。

+1

Eclipseコレクション、Koloboke、HPPCを忘れた:http://java-performance.info/hashmap-overview-jdk-fastutil-goldman-sachs-hppc-koloboke-trove-january-2015/ – leventov

関連する問題