2015-10-03 6 views
5

ローカル変数:プログラミングプラクティス次の方法を考える

public int methodOne() { 
    int total = local_int_one + local_int_two; 
    return total; 
} 

public int methodTwo() { 
    return local_int_one + local_int_two; 
} 

1)は、上記の方法の可読性の唯一の違いですかマイクロ最適化「の利点は、」)(methodTwoにあるのでしょうか?

2)狭い範囲のローカル変数を定義するのは、可能なときに避けて避けるべきですか? methodTwo()わずか、より効率的である:短い答えは

+0

私はあなた自身の質問に答えたと思います。 –

+2

バイトコードを確認してください。 (2)は命令が1つ少ない。 – EJP

+0

@EJP:最適化を有効にするとどうなりますか?現在、私はJavaバイトコードビューアにアクセスできません。しかし明らかにデバッグモードの結果、ある種の1対1マッピングが発生します。 –

答えて

5

(いくつかの計算は、単一のステートメントで実行されなければならない場合、私はmethodTwoが読めなくなってきて見ることができます)。次のバイトコードで

methodOne()結果:

public int methodTwo(); 
0 aload_0 [this] 
1 getfield com.example.Test.local_int_one : int [13] 
4 aload_0 [this] 
5 getfield com.example.Test.local_int_two : int [15] 
8 iadd 
9 ireturn 

しかし、この最適化があまりにもマイナーであることに注意してください、この場合、コードの可読性:

public int methodOne(); 
0 aload_0 [this] 
1 getfield com.example.Test.local_int_one : int [13] 
4 aload_0 [this] 
5 getfield com.example.Test.local_int_two : int [15] 
8 iadd 
9 istore_1 [total] 
10 iload_1 [total] 
11 ireturn 

そして、ここではmethodTwo()のためのバイトコードですいくつかのJava命令のほうが重要です。

一時変数がコードの可読性に寄与すると考える場合は、必ずそれを使用してください。

+0

約2年後、もし私がフォローアップしたいと思ったらここに追加したいと思います。 methodTwo()はistore_1を実行しないので、これは(Javaでは)実行する追加のgcステップがないことを意味しますか? ...非常に重要な環境では、小さなスコープで変数をインスタンス化することは避けなければなりませんか? – mcw

+1

@mcwでは、整数はガベージコレクションやローカル変数の対象にはなりません。オブジェクトに関しては、どんな場合でもヒープ上に作成されます。https://stackoverflow.com/a/27587519/2170192 –

関連する問題