Java講座

最適化の章
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
前のページ   次のページ

当ページ・当社へのご意見やご感想があればお手数ですが「お問い合わせ」までお願いいたします。
当社への就職をお考えの方は「採用情報ページ」までお願いいたします。
C言語を学びたい方は「C言語講座」もどうぞ。