HomeJava>パフォーマンスチューニングfor文におけるパフォーマンス改善

Javaにおけるfor文を書くときに注意すればパフォーマンスを改善することが可能です

for文の書き方に注意

List件数分、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万回もループするような実装はほとんど無いかもしれませんが
確実に早くなります。
対応していない場合は、対応をおすすめします。

実際の開発では、検索結果一覧の表示などは、比較的多くの件数をループで回すことが多いので
ぜひ対応しておきたい内容だと思います。

ページトップへ

トピックアップ メニュー

トピックアップ リンク

Copyright (C) トピックアップ All Rights Reserved.
inserted by FC2 system