0

私のクラスの 1 つのメソッドは、内部のもののためにいくつかの配列の新しいコピーを必要とするので、そのようなものを書く必要があります:

public void FrequentlyCalledMethod {
    int[] a = new int[100];
    ....

しかし、メソッドが頻繁に呼び出され、配列の内容が意味をなさないため(とにかく置き換えられます)、配列が十分に大きいため、最適化してそのようなものを書きたいと思います:

private int[] a = new int[100];
public void FrequentlyCalledMethod {
    ....

メソッドが毎秒 100 回呼び出されると仮定すると、毎秒約 100 * 100 * sizeof(int) バイトのヒープ メモリを節約できます。

問題は、クラス宣言が「ダーティ」になっていることです。1 つのメソッドだけが必要とする情報がフィールドに含まれています。このようなフィールドが多すぎると、「通常の」フィールドが「パフォーマンスの最適化」フィールドと混在するため、クラスが非常に「判読不能」になります。

私に何ができる?それとも、パフォーマンスか可読性のどちらかを選択する必要がありますか? どうにかして両方持つことはできますか?

4

2 に答える 2

0

最初のケースでは、内部の配列FrequentlyCalledMethod はローカル変数を使用して参照されるため、メソッドが終了するとガベージコレクションされます。このシナリオでは、ヒープの過剰使用はありません。

ただし、配列をメンバー属性として宣言する場合。FrequentlyCalledMethod 配列インスタンスは、メソッドが呼び出されたかどうかに関係なく、すべての親オブジェクトの存続期間中存続します。

結論として、ヒープスペースを保持し、プログラムのメモリ効率を高めたい場合は、ローカル属性を使用して、特定の場合にインスタンス変数を回避します。

于 2012-04-30T06:57:32.060 に答える
0

いいえ、クラス宣言は汚れていません。クラス宣言は、パブリック インターフェイスをマングルした場合にのみダーティになります。そして、これはプライベートフィールドです。これにはプライベート フィールドが使用されます。

あまりにも多くのプライベート変数が心配な場合は、小さなクラスを使用してみてください。メソッドに 3 つのプライベート変数が必要な場合は、それらの 3 つの変数を使用してクラスを作成し、オブジェクトを現在のクラスにプライベート フィールドとして格納できます。

class A{
    private int a;
    private int b;
    private int c;
    public int get_num(){
        return a+b+c;
    }
}

あなたはこれを使うことができます、

class B{
    private int a;
    private int b;
    private int c;
    public int get_num(){
        return a+b+c;
    }
}

class A{
    private B b;
    public int get_num(){
        return b.get_num();
    }
}
于 2012-04-30T07:00:10.980 に答える