はじめに
こんにちは、こんばんは、ココネ株式会社のサーバーを担当しています。
本ページではJavaを書いていてスタイルチェッカーで指摘されるローカル変数の冗長化について調べてみたことを書きます。
Javaコード
以下のコードをまずは見てみます。
単に足し算するだけのaddtion methodがあるシンプルなコードです。
public class Calculation {
public static void main(String[] args) {
int x = 1;
int y = 2;
int answer = addition(x, y);
System.out.println(answer);
}
public static int addition(int x, int y) {
int answer = x + y;
return answer;
}
}
コードチェッカーにローカル変数が冗長と注意されます
int answer = x + y;
return answer;
この部分は、answerに一度結果を格納してreturnしているのですが、チェッカーでは冗長と指摘されます。
以下のように修正できます。
return x + y;
answerに格納せずに直接returnする形です。
確かにすっきりします。
が、今回のSampleのように単純な足し算の式でしたらこれでもすぐに何を行っているのか理解はできます。
ただもっと複雑な処理や別の業務ロジックを行うmethodの呼び出しと組み合わせている場合は、一度ローカル変数に格納されてその変数名がわかりやすい名称であれば処理の内容が理解しやすいかもしれません。(このあたりは個人の好みやチームのコーディングルールが変わってくると思います)
バイトコードはどのようになっているのか?
それぞれローカル変数に一度格納した場合、格納しなかった場合にわけてバイトコードを出力させてみました。
- ローカル変数に格納した場合
public static int addition(int, int);
Code:
0: iload_0
1: iload_1
2: iadd
3: istore_2
4: iload_2
5: ireturn
- ローカル変数に格納しなかった場合
public static int addition(int, int);
Code:
0: iload_0
1: iload_1
2: iadd
3: ireturn
ローカル変数に格納した場合は、
2: iadd
で足し算を行った後に3: istore_2
でスタックに一度、storeします。それを4: iload_2
でloadしてreturnする処理です。
それに比べてローカル変数に格納しなかった場合の方が、処理数が減っています。
足し算を行った後にスタックに積まれている結果をすぐにreturnしています。
バイトコードを見ても後者の方が速そうです。
実際に複数回実行して速度を比較してみました
足し算するだけの単純な処理なので1000万回ループさせて、その結果10回の平均値を取ってみました。
ローカル変数あり | ローカル変数なし |
---|---|
5.3ms | 4.6ms |
当たり前と言っては当たり前なのですが、ローカル変数なしの方が速い結果となります。
まとめ
厳しいメモリ環境や少しでもステップ数を少なくコーディングしないといけない組み込み系ではあたりまえな考えなのかもしれませんが、普段JVMで動く言語のコーディングしているとバイトコードまで意識してコーディングすることは少ないかもしれません。ただちょっとした書き方の変更しだいで処理速度があがることを知っておくことは有効かと思いました。