3

Javaでは、次のようになります。

Set<Integer> set = new HashSet<Integer>();
callVoidMethod(set);
...
public static void callVoidMethod(Set<Integer> set) {

    Set<Integer> superset = new HashSet<Integer>(set);
    ...
    // I just added this loop to show that I'm adding quite a lot
    // well, it depends on conditions, sometimes I add nothing,
    // but it is unpredictable and do not know if add something
    for (int i = 0; i < 1000; i++) {
         ...
         if (conditionSatisfied) superset.add(someValue);
         ...
    }

}

上記のコードは単純化されています。アイデアは、参照によってセットをvoidメソッドに渡し、セットの完全なコピーを作成して、コピーにいくつかの新しい要素を追加できるようにすることです(ここではスーパーセット)。 voidメソッドを終了するときに、必要に応じて設定します。

私のコードは多くのデータ処理で動作します。コピーを作成するためのより高速な方法がない場合は、HashSetそれ自体を最適化したいと思います。たとえばInteger、キーとしてのsは必要ありませんが、より優れたプリミティブintです。int[]キーの配列をMyHashSet?に実装することをお勧めします。

可能であれば、これを改善するために同じアイデアを使用することに興味があります。

Map<Integer, ArrayList<Item>> map = new HashMap<Integer, ArrayList<Item>>();

編集:私は速度-パフォーマンス-最適化だけが必要です。美しく維持可能なコードとメモリは必要ありません。

4

3 に答える 3

8

一般に、プリミティブを許可する高速コレクションを探している場合は、Troveの使用を検討してください。これが実際にボトルネックであることを発見しない限り、最適化しないでください。あなたまたは他の誰かがこのコードを維持する必要があり、最適化されたバージョンを読むことはしばしば困難です。

于 2012-08-06T16:58:46.690 に答える
6

最初に HashSet の初期容量と負荷率を微調整してみましたか?

ハッシュセット

ここにあなたを助けるかもしれない投稿があります。

HashMap 初期化パラメーター

処理するデータが大量にある場合は、その分布を分析し、これらの設定を最初に調整することをお勧めします。

それを微調整すると、整数を int に置き換えるとパフォーマンスがわずかに向上する可能性がありますが、この改善だけで得られるものよりも、JVM 実装の詳細とハードウェア構成に依存する可能性があります。

于 2012-08-06T17:03:03.340 に答える
5

これらのオブジェクトを後でどうしますか? 検索などを行っているだけの場合は、完全なコピーを作成するよりも、それらを分離して両方をチェックする方が速い場合があります。そう、

public static void callVoidMethod(Set<Integer> set) {

    Set<Integer> superset = new HashSet<Integer>();
    ...
    if (conditionSatisfied) superset.add(someValue);

    ...
    if(set.contains(value) || superset.contains(value))
        doSomething();

}
于 2012-08-06T17:00:40.460 に答える