Javaでループを高速化する方法は、用途によって様々ありますが、以下のようなポイントを押さえることでパフォーマンスの最適化が可能です。
✅ 1. ループ外での不要な処理を避ける
// 悪い例:毎回 list.size() を呼んでいるfor (int i = 0; i < list.size(); i++) { // 処理}// 良い例:事前にキャッシュint size = list.size();for (int i = 0; i < size; i++) { // 処理}
✅ 2. 拡張 for 文より index for 文(必要な場合)
// 拡張 for は簡潔だけど Iterator を使うfor (String s : list) { // 処理}// より高速にしたいときは index for(特に ArrayList で有効)for (int i = 0; i < list.size(); i++) { String s = list.get(i); // 処理}
✅ 3. stream よりも通常ループ(パフォーマンス重視時)
// Java 8 Stream(読みやすいがやや遅い)list.stream().forEach(item -> { // 処理});// 高速化:通常の for 文の方が軽い(特に大量データ時)for (int i = 0; i < list.size(); i++) { var item = list.get(i); // 処理}
✅ 4. 並列処理の活用(マルチコアCPU)
// 並列ストリーム(コア数に依存)list.parallelStream().forEach(item -> { // 並列処理});
✅ 5. 配列(primitive)を使う
// オブジェクトのリストよりプリミティブ配列の方が圧倒的に速いint[] arr = new int[10000];for (int i = 0; i < arr.length; i++) { arr[i] = i * 2;}
✅ 6. ループの中でのオブジェクト生成を避ける
// 悪い例(毎回インスタンスを生成)for (int i = 0; i < 10000; i++) { MyObj obj = new MyObj(); // 遅い}// 良い例(再利用できるなら使い回す)MyObj obj = new MyObj();for (int i = 0; i < 10000; i++) { obj.reset(); // 再利用}
✅ 7. JITコンパイラによる最適化を考慮
✅ 補足:プロファイリングで確認する
高速化を狙う場合、**JMH(Java Microbenchmark Harness)**などでベンチマークを取るのが理想です。
✅ まとめ
| 方法 | 効果 |
|---|
size()などをループ外に出す | 小 |
for vs foreach の選択 | 小〜中 |
streamより通常ループ | 中 |
parallelStream の活用 | 大(並列可能なら) |
| プリミティブ配列を使う | 中〜大 |
| オブジェクトの再利用 | 中 |
| JITとJMHで測定 | 安定した改善指標に |
この記事へのコメント