JAvaにおける異なるサイクルの系エネルギー比較
Javaのようなプログラミング言語では、ループはフローを制御する最も一般的な方法の一つであり、この文章ではループの基本的な知識を議論するつもりはありません.これは本文章の範囲を超えており、皆さんはこれについてよく知っています.
この記事では、日常的に使用されるループの異なる方法をリストし、同じセットを使用してパフォーマンスを比較します.
異なるサイクル
私が知っている4つの異なる方法をリストします.他の方法を知っている場合は、コメントで教えてください.
for each文
このテクノロジーはjava 5の後に使用されます
listを使用size()
sizeを使用して別のローカル変数を初期化
ループ内で初期化
すべてのタイプのパフォーマンスの比較
ArrayListを作成し、1千万の整数を格納し、使用者が4つの方法で遍歴することで、系エネルギーの違いを見ることができます.
実行環境
java 7
eclipse Juno
上のコードを実行すると、コンソールから下の動作が出力されます
明らかに後者の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/
この記事では、日常的に使用されるループの異なる方法をリストし、同じセットを使用してパフォーマンスを比較します.
異なるサイクル
私が知っている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/