ListインタフェースにおけるArrayList,LinkedList,Vectorの値取り方法のいくつかの性能テストについて
5053 ワード
Listインタフェースの下のArrayList、LinkedList、Vectorの値の取り方のテスト:
ArrayListの値取り方法のテスト:
実行結果は次のとおりです.
ArrayList iterValue消費時間:50
ArrayList forValue消費時間:3
iteratorを使用して値を取得する場合、元のforサイクルよりも明らかに遅いのは、ArrayListがリストベースの配列であるべきであり、配列が下付きでデータを取得するのが最も速い方法である.
LinkedListの例を見てみましょう.
注意:LinkedListを使用している間は集合要素の個数も最初は1000000に設定されていましたが、実行中に元のforループを使用している間に直接メモリがオーバーフローしたため、要素の個数は100000に変更されました.
実行結果は次のとおりです.
linkedList iterValue消費時間:6
linkedList forValue消費時間:11982
iteratorを使用するのは非常に速いが、元のforサイクルを使用する場合、性能があまりにも悪い.その原因を究明すると、LinkedListは双方向チェーンテーブルの実現に基づいており、チェーンテーブルでポインタを使用するのは下付き文字を使用するよりもデータを取得するのがずっと速い.
Vectorのテストを見てみましょう.
実行結果は次のとおりです.
要素の数が1000000に設定された結果:
VectoriterValue消費時間:226
VectorforValue消費時間:438
要素の数が100000に設定された結果:
Vector iterValue消費時間:7
VectorforValue消費時間:5
まず、Vectorもリストの配列ベースの実装であり、ArrayListとは異なり、Vectorはスレッドが安全な可変配列である.
結果は、Vectorの要素を取得する際、結果1では、iteratorの方式が元のforサイクルの方式よりずっと速く、結果2では元のforサイクルがiteratorの方式より速く、スレッドが安全な環境では、データ量が大きすぎる場合、iteratorの方式が元のforサイクルの方式よりずっと効果的であることを示している.
ArrayListとVectorの結果を比較すると、データ量が同じ場合、どのようにしてもスレッドが安全でないものよりもはるかに遅い、
したがって,マルチスレッド環境でなければ,Vectorを用いずにArrayListまたはLinkedListを用いるのが適切であり,チェーンテーブルベースの実装であればiteratorを用いるのが好ましく,配列ベースの実装であれば元のforループを用いるのがよい.
ArrayListの値取り方法のテスト:
package com.test.collections.list;
import java.util.ArrayList;
import java.util.Iterator;
/**
*
* ArrayList
* @author work
*
*/
public class TestArraryList{
private static ArrayList<String> strs = new ArrayList<String>();
/**
*
* @param arrays
*/
private static void setValue(String[] arrays){
strs.toArray(arrays);
}
/**
*
*/
private static void setValue(){
for(int i=0; i<10000000; i++){
strs.add("strs"+i);
}
}
private static void iterValue(){
long start = System.currentTimeMillis();
for (Iterator<String> iterator = strs.iterator(); iterator.hasNext();) {
String str = (String) iterator.next();
//System.out.println(" iterator value "+ str);
}
long end = System.currentTimeMillis();
System.out.println(" ArrayList iterValue :" + (end-start));
}
private static void forValue(){
long start = System.currentTimeMillis();
for (int i = 0; i < strs.size(); i++) {
strs.get(i);
}
long end = System.currentTimeMillis();
System.out.println(" ArrayList forValue :" + (end-start));
}
public static void main(String[] args){
setValue();
iterValue();
forValue();
}
}
実行結果は次のとおりです.
ArrayList iterValue消費時間:50
ArrayList forValue消費時間:3
iteratorを使用して値を取得する場合、元のforサイクルよりも明らかに遅いのは、ArrayListがリストベースの配列であるべきであり、配列が下付きでデータを取得するのが最も速い方法である.
LinkedListの例を見てみましょう.
package com.test.collections.list;
import java.util.Iterator;
import java.util.LinkedList;
public class TestLinkedList {
private static LinkedList<String> strings = new LinkedList<String>();
/**
*
*/
private static void setValue(){
for(int i=0; i<100000; i++){
strings.add("str"+i);
}
}
/**
*
* @param strs
*/
private static void setArrayValue(String[] strs){
strings.toArray(strs);
}
private static void iterValue(){
long start = System.currentTimeMillis();
for (Iterator<String> iterator = strings.iterator(); iterator.hasNext();) {
String str = (String) iterator.next();
//System.out.println(" iterator value "+ str);
}
long end = System.currentTimeMillis();
System.out.println(" linkedList iterValue :" + (end-start));
}
private static void forValue(){
long start = System.currentTimeMillis();
for (int i = 0; i < strings.size(); i++) {
strings.get(i);
}
long end = System.currentTimeMillis();
System.out.println(" linkedList forValue :" + (end-start));
}
public static void main(String[] args) {
//String[] val = new String[]{"dddd","dddss","ssss","ggg","eee"};
//setArrayValue(val);
setValue();
iterValue();
forValue();
}
}
注意:LinkedListを使用している間は集合要素の個数も最初は1000000に設定されていましたが、実行中に元のforループを使用している間に直接メモリがオーバーフローしたため、要素の個数は100000に変更されました.
実行結果は次のとおりです.
linkedList iterValue消費時間:6
linkedList forValue消費時間:11982
iteratorを使用するのは非常に速いが、元のforサイクルを使用する場合、性能があまりにも悪い.その原因を究明すると、LinkedListは双方向チェーンテーブルの実現に基づいており、チェーンテーブルでポインタを使用するのは下付き文字を使用するよりもデータを取得するのがずっと速い.
Vectorのテストを見てみましょう.
package com.test.collections.list;
import java.util.Iterator;
import java.util.Vector;
public class TestVector {
private static Vector<String> strings = new Vector<String>();
/**
*
* @param arrays
*/
private static void setValue(String[] arrays){
strings.toArray(arrays);
}
/**
*
*/
private static void setValue(){
for(int i=0; i<10000000; i++){
strings.add("str"+i);
}
}
private static void iterValue(){
long start = System.currentTimeMillis();
for (Iterator<String> iterator = strings.iterator(); iterator.hasNext();) {
String str = (String) iterator.next();
//System.out.println(" iterator value "+ str);
}
long end = System.currentTimeMillis();
System.out.println(" Vector iterValue :" + (end-start));
}
private static void forValue(){
long start = System.currentTimeMillis();
for (int i = 0; i < strings.size(); i++) {
strings.get(i);
}
long end = System.currentTimeMillis();
System.out.println(" Vector forValue :" + (end-start));
}
public static void main(String[] args) {
setValue();
iterValue();
forValue();
}
}
実行結果は次のとおりです.
要素の数が1000000に設定された結果:
VectoriterValue消費時間:226
VectorforValue消費時間:438
要素の数が100000に設定された結果:
Vector iterValue消費時間:7
VectorforValue消費時間:5
まず、Vectorもリストの配列ベースの実装であり、ArrayListとは異なり、Vectorはスレッドが安全な可変配列である.
結果は、Vectorの要素を取得する際、結果1では、iteratorの方式が元のforサイクルの方式よりずっと速く、結果2では元のforサイクルがiteratorの方式より速く、スレッドが安全な環境では、データ量が大きすぎる場合、iteratorの方式が元のforサイクルの方式よりずっと効果的であることを示している.
ArrayListとVectorの結果を比較すると、データ量が同じ場合、どのようにしてもスレッドが安全でないものよりもはるかに遅い、
したがって,マルチスレッド環境でなければ,Vectorを用いずにArrayListまたはLinkedListを用いるのが適切であり,チェーンテーブルベースの実装であればiteratorを用いるのが好ましく,配列ベースの実装であれば元のforループを用いるのがよい.