Javaにおけるfor文を書くときに注意すればパフォーマンスを改善することが可能です
Javaでパフォーマンス改善を行ないたい場合、
どうしてもガベージ・コレクションとかヒープメモリ、マルチスレッドに行ってしまいがちですが
その前に、足元にあることでも、パフォーマンスを改善することができます。
例として、以下のようなJavaコードには、パフォーマンス改善の余地があります。
import java.util.ArrayList; import java.util.List; public class JavaLoopPerformance1 { public static void main(String[] args) { List<String> list = new ArrayList<String>(); // 10万件分のデータをためる for(int i=0; i<100000; i++) { list.add(String.valueOf(i)); } long start = System.nanoTime(); for(int i=0; i<list.size(); i++) { ; } // 何もしないで、ただループをスルーしただけの結果を表示 System.out.println(System.nanoTime() - start); } }
上記を10回実行した結果は、それぞれ
817096, 818325, 817157, 816634, 824013
814311, 814649, 816630, 819194, 822472
※単位はナノ秒
となり、平均で
818048ナノ秒となりました。
上記のfor文の記述では、list.size()を、10万回、ループの初めに必ず実行してしまいます。
ループで回すList件数が変更しない場合、上記のような書き方は
Javaのパフォーマンスを低減させてしまいます。
ここに、パフォーマンス改善の糸口があります。
以下のようにfor文の書き方を修正することで、パフォーマンスを改善することができます。
import java.util.ArrayList; import java.util.List; public class JavaLoopPerformance1 { public static void main(String[] args) { List<String> list = new ArrayList<String>(); // 10万件分のデータをためる for(int i=0; i<100000; i++) { list.add(String.valueOf(i)); } long start = System.nanoTime(); // list.size()値を格納するnを用意 for(int i=0, n=list.size(); i<n; i++) { ; } // 何もしないで、ただループをスルーしただけの結果を表示 System.out.println(System.nanoTime() - start); } }
とすると、
76913, 75977, 76323, 75128, 75187
75808, 77243, 76683, 77379, 75582
※単位はいずれもナノ秒
となり、
平均で、76222ナノ秒
となりました。
修正前の10倍ほど、処理速度が上がっています。
実際の開発では、10万回もループするような実装はほとんど無いかもしれませんが
確実に早くなります。
対応していない場合は、対応をおすすめします。
実際の開発では、検索結果一覧の表示などは、比較的多くの件数をループで回すことが多いので
ぜひ対応しておきたい内容だと思います。