1

このコードは完全に機能しますが、残念ながら Arrays.sort() Comparator が原因でガベージ コレクションがトリガーされます。

ガベージ コレクションをトリガーしない方法はありますか?

(注: このコードは、より「汎用的」になるように変更されています。実際のコードは Android ゲーム用であり、ガベージ コレクションによるスローダウンが問題になるのはそのためです。)

static final byte INCOME = 0;
static final byte INDEX = 1;

public void vSortEmployees() {
    nPaidEmployees = 0;

    for (nIter=0; nIter<MAX_EMPLOYEES; nIter++) {

        if ((employees[nIter].current == true) && (employees[nIter].volunteer == false)) {

            // We have another current and paid employee; add that employee's "amount earned to date" to the list.
            paidemployees[nPaidEmployees][INCOME] = employees[nIter].fGetTotalIncomeToDate();
            paidemployees[nPaidEmployees][INDEX] = nIter;

            nPaidEmployees++;
        }
    }

    Arrays.sort(paidemployees, new Comparator<float[]>() {
        @Override
        public int compare(float[] f1, float[] f2) {
            if (f2[INCOME] < f1[INCOME]) 
                return -1;
            else if (f2[INCOME] > f1[INCOME])
                return 1;
            else
                return 0;
        }
    });

    // Now we have a list of current, paid employees in order of income received.

    // Highest income paid out
    paidemployees[0][INCOME]

    // Second highest income paid out
    paidemployees[1][INCOME]

    // If we need to reference the original employee object, we can:        
    employees[paidemployees[0][INDEX]].getName();
}
4

1 に答える 1

1

GC を一貫してトリガーする方法とトリガーしない方法はありません。GC は独自の生活を送っています。配列をソートしているときに実行されるという事実は、何の意味もありません。

しかし、おそらくあなたは何かをすることができます。コンパレータに匿名の内部クラスを使用しないでください。これは本当に必要ありません。通常のクラスを使用し、そのオブジェクトをシングルトンとして作成します。次に、このインスタンスを使用します。この場合、ソート中にコード内に新しいオブジェクトは作成されず、GC はおそらく実行されません。

class FloatArrayComparator implements Comparator<float[]>() {
    @Override
    public int compare(float[] f1, float[] f2) {
        if (f2[INCOME] < f1[INCOME]) 
            return -1;
        else if (f2[INCOME] > f1[INCOME])
            return 1;
        else
            return 0;
    }
};


class SomeClass {
    private Comparator<float[]> floatArrayComparator = new FloatArrayComparator();

    void myMethod() {
         Arrays.sort(myArray, floatArrayComparator);
    }

}
于 2012-09-15T06:15:22.883 に答える