JAvaにおける異なるサイクルの系エネルギー比較


Javaのようなプログラミング言語では、ループはフローを制御する最も一般的な方法の一つであり、この文章ではループの基本的な知識を議論するつもりはありません.これは本文章の範囲を超えており、皆さんはこれについてよく知っています.
この記事では、日常的に使用されるループの異なる方法をリストし、同じセットを使用してパフォーマンスを比較します.
異なるサイクル
私が知っている4つの異なる方法をリストします.他の方法を知っている場合は、コメントで教えてください.
for each文
このテクノロジーはjava 5の後に使用されます
private static List<Integer> list = new ArrayList<>();
for(Integer i : list)
{
    // do other stuff
}

listを使用size()
private static List<Integer> list = new ArrayList<>();
for(int j = 0; j < list.size() ; j++)
{
    //do stuff
}

sizeを使用して別のローカル変数を初期化
private static List<Integer> list = new ArrayList<>();
int size = list.size();
for(int j = 0; j < size ; j++)
{
    //do stuff
}

ループ内で初期化
private static List<Integer> list = new ArrayList<>();
for(int j = list.size(); j > size ; j--)
{
    //do stuff
}

すべてのタイプのパフォーマンスの比較
ArrayListを作成し、1千万の整数を格納し、使用者が4つの方法で遍歴することで、系エネルギーの違いを見ることができます.
実行環境
java 7
eclipse Juno
package com.howtodoinjava.demo.core;
 
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
 
public class ForLoopPerformanceTest
{
    private static List<Integer> list = new ArrayList<>();
    private static long startTime;
    private static long endTime;
    static
    {
        for(int i=0; i < 1_00_00_000; i++)
        {
            list.add(i);
        }
    }
    @SuppressWarnings("unused")
    public static void main(String[] args)
    {
        //Type 1
        startTime = Calendar.getInstance().getTimeInMillis();
        for(Integer i : list)
        {
            //
        }
        endTime = Calendar.getInstance().getTimeInMillis();
        System.out.println("For each loop :: " + (endTime - startTime) + " ms");
 
        //Type 2
        startTime = Calendar.getInstance().getTimeInMillis();
        for(int j = 0; j < list.size() ; j++)
        {
            //
        }
        endTime = Calendar.getInstance().getTimeInMillis();
        System.out.println("Using collection.size() :: " + (endTime - startTime) + " ms");
 
        //Type 3
        startTime = Calendar.getInstance().getTimeInMillis();
        int size = list.size();
        for(int j = 0; j < size ; j++)
        {
            //System.out.println(j);
        }
        endTime = Calendar.getInstance().getTimeInMillis();
        System.out.println("Using [int size = list.size(); int j = 0; j < size ; j++] :: " + (endTime - startTime) + " ms");
 
        //Type 4
        startTime = Calendar.getInstance().getTimeInMillis();
        for(int j = list.size(); j > size ; j--)
        {
            //System.out.println(j);
        }
        endTime = Calendar.getInstance().getTimeInMillis();
        System.out.println("Using [int j = list.size(); j > size ; j--] :: " + (endTime - startTime) + " ms");
    }
}

上のコードを実行すると、コンソールから下の動作が出力されます
For each loop :: 110 ms
Using collection.size() :: 37 ms
Using [int size = list.size(); int j = 0; j < size ; j++] :: 4 ms
Using [int j = list.size(); j > size ; j--] :: 1 ms

明らかに後者の2つの方式の性能は比較的に良くて、for eachの系エネルギーは他の3つに比べて最も高価です
パフォーマンスが異なる理由
後者の2つの性能の差は大きくなく、同じと考えるべきだ.彼らは同じようにコレクションのサイズを取得し、ループでこの値を使用して条件が成立しているかどうかを確認します.
2つ目は、呼び出すたびにsizeメソッドを使用することであり、パフォーマンスの問題の主な原因となります.
1つ目の方法は、各ループの内部で作成するループを使用してiteratorを作成し、呼び出すために最も時間がかかる.get()は他の3つの方法に比べて高い性能消費がある
原文住所:http://howtodoinjava.com/2013/03/26/performance-comparison-of-different-for-loops-in-java/