6

(例として文字列を使用していますが、オブジェクト > MB のメモリに置き換えることができます)

これをかなり頻繁に行います:

private static String mTempString = "";

private static void SomeMethod()
{
    mTempString = "Whatever Result";
}

さて、私の質問は、次のように書くとしたら、次のとおりです。

private static void SomeMethod()
{
    String mTempString = "Whatever Result";
}

そしてそれをループで使用します(例として1秒間に数百回実行されます)Javaは例1のようにメモリを管理する方法を知っていますか? メモリは効率的に同じであろう。(申し訳ありませんが、現時点ではこれを自分でテストできません)

どちらがよりメモリ効率が良いか (それらが小さな変数であるという事実を無視して)

--編集--- http://www.cs.berkeley.edu/~jrs/4/lec/08を説明する優れた記事を見つけました

4

6 に答える 6

3

一般に、変数のスコープをできるだけ制限することを好みます。これにより、コードの理解、デバッグ、およびリファクタリングが容易になります。

この場合、どちらの場合もこれらの変数に必要なメモリは非常に小さくなります。各変数は、オブジェクト自体ではなく、オブジェクトへの参照です。参照は、ローカル変数として使用される場合、わずか 4 バイトで済みます。

于 2013-05-27T02:33:21.543 に答える
1

ローカル変数のスコープは、常に可能な限り小さくする必要があります。

スコープ外の変数が必要でない限り、スコープ内で変数を宣言することをお勧めします。この場合、パフォーマンスの違いはありませんが、コーディングのベスト プラクティスとして、可能な限り小さいスコープで変数を宣言することをお勧めします。この類似した人気のあるSO の質問を参照してください

別のシナリオは、文字列の代わりに不変型を使用することです。わずかなパフォーマンスの違いがある場合 (ごくわずか)。各ループで変数を初期化する必要がないため、トップで宣言する方が少し良いでしょう。ただし、毎回新しいオブジェクトを作成しているため、文字列では問題ありません。

于 2013-05-27T02:34:54.677 に答える
1

Jvm は、これが定数であることを判断し、必要に応じて最適化できる必要があるため、どちらのスタイルについても心配する必要はありません。

算術式の場合、JVM は定数折りたたみの最適化を実行できます。

文字列だけに興味がある場合、定数文字列は文字列プール内に格納されます。

ご存知かもしれませんが、Java では文字列は不変です。

したがって、Java に定数文字列がある場合、それらは 1 回だけ格納され、すべての参照はその文字列オブジェクトを指します。

例えば

    String s = "a" + "bc";

    String t = "ab" + "c";

    System.out.println(s == t);

t と s は同じ文字列オブジェクトを指しているため、true を返します。

さらに、Java クラスには、これらのようなすべての定数が移動される定数プールがあります。

本質的に、JVM は非常に賢いので、少なくとも効率の点では、これらのおもちゃの例のいずれかが互いに優れているとは思いません。他の回答が言及しているように、おそらく考慮すべきソフトウェア設計の考慮事項があります。

于 2013-05-27T02:53:19.447 に答える