私の問題は、前の投稿Optimal HashSet Initialization (Scala | Java)によく似ています。ここでは、スピードアップのために使用したいのですがHashSet
(現在は を使用していますSet
)、HashSet
その (一定時間の) 利点は示されません。
言及された解決策について:
インターンすることで対等のコストを最小限に抑えることができます。これは、要求された新しいオブジェクトが既に存在するかどうかを確認し、存在する場合は既存のオブジェクトへの参照を返すファクトリ メソッドを介してクラスの新しいオブジェクトを取得することを意味します。この型のすべてのオブジェクトがこのように構築されていると主張する場合、それぞれの個別のオブジェクトのインスタンスは 1 つだけであり、equals はオブジェクトの同一性と同等になることがわかります。これは安価な参照比較 (Scala の eq) です。
ただし、効率的な確認方法が何であるかはよくわかりません
要求された新しいオブジェクトが既に存在するかどうか
大きなオブジェクトの場合 (例: ハッシュマップのパラメーターを持つケース クラスのオブジェクト、その他のオブジェクト構造など)
これらの複雑なフィールドのそれぞれを比較しても、パフォーマンス上の利点はあまりありませんね。または、そうである場合、他の方法はありますか?
また、作り方にも戸惑います
equals は、安価な参照比較 (Scala の eq) であるオブジェクト ID と同等になります。
コードで。
上記の intening 手法は、基本的にはオブジェクト キャッシュだと思います。したがって、 Java の小さな不変オブジェクトのキャッシング戦略の投稿で言及されている手法を参照しますか? . ただし、大きなオブジェクトの効率的な方法はまだわかりません。
便宜上、投稿からキャッシング手法 (Java で) を引用し、///
私の考えと質問を示します。
private static final int N_POINTS = 10191;
private static final Point[] POINTS = new Point[N_POINTS];
public static Point of(int x, int y, int z) {
int h = hash(x,y,z); /// I can use hash code of each complicated field to construct the value
int index = (h & 0x7fffffff) % N_POINTS;
Point p = POINTS[index];
if (p != null && p.x == x && p.y == y && p.z == z) /// Not working for large objects?
return p;
return POINTS[index] = new Point(x,y,z);
}
HashSet
要約すると、Scalaで利用できるように、大きなオブジェクトの効率的なキャッシュ戦略を実装するためのベスト プラクティスは何ですか?
ありがとう、