5.1. ループ条件部でメソッドコールしない
『目的』
ループ条件でのメソッド呼び出しを避けて実行速度を上げましょう。
『Before』
ループ条件内でメソッドを呼び出してみます。
List strings = Collections.synchronizedList(new ArrayList());
:
for (int i = 0; i < strings.size(); i++) {
:
}
1回のループにつき必ず strings.size() が呼ばれます。
ループ時に条件値が変わらないのであれば無駄な処理ですね。
空処理を1,000,000回繰り返した場合、31ms要しました。
『After』
値をキャッシュすることで不要な処理を省きましょう。
List strings = Collections.synchronizedList(new ArrayList());
:
for (int i = 0, n = strings.size(); i < n; i++) {
:
}
空処理を1000000回繰り返した場合、0 ms(1ms未満)で済みました。
『まとめ』
微々たるものですが、確実に速くなります。
メソッドの重さによってはもっと大きく差が出てくるでしょう。
ループ条件部で呼び出すメソッドはいつもsize() メソッドとは限らないですが、
毎回メソッドを呼び出してチェックする必要がない場合は条件値をキャッシュしましょう。
なお、配列の長さを取得する際は算出処理がないので効果はありません。
String[] strings = new String[10];
:
for (int i = 0; i < strings.length; i++) {
:
}
改善前:0ms 改善後:0ms