0

나는 이 ArrayList보다 빨리 채워질 것이라고 생각 해왔다. 내가 알고 있듯이 ArrayList은 제한된 길이 (상수)의 간단한 배열을 기반으로합니다. 따라서 배열이 범위를 벗어날 때마다 더 높은 범위의 새로운 배열이 만들어집니다. LinkedList은 훨씬 간단합니다. 메모리를 제외하고는 아무런 제한이 없기 때문에 더 빨리 채워야합니다. 그러나 나는 다음 코드를 실행 :필링 ArrayList 대 LinkedList

public static void main(String[] args) { 
     int length = 7000000; 

     List<Integer> list = new LinkedList<Integer>(); 
     long oldTime = System.currentTimeMillis(); 
     for (int i = 0; i < length; i++) { 
      list.add(i); 
     } 
     System.out.println("LinkedList fill: " + (System.currentTimeMillis() - oldTime)); 

     list = new ArrayList<Integer>(); 
     oldTime = System.currentTimeMillis(); 
     for (int i = 0; i < length; i++) { 
      list.add(i); 
     } 
     System.out.println("ArrayList fill: " + (System.currentTimeMillis() - oldTime)); 
    } 

출력은 : 왜 그렇게

LinkedList fill: 3936 
ArrayList fill: 628 

?

+4

귀하의 벤치 마크에 결함이 있기 때문에. http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java – assylias

+0

스왑을 시도 했습니까? 먼저 arraylist와 linkedlist보다? –

+0

그 반대의 경우, 즉 ArrayList를 먼저 수행 한 다음 LL? 또한 ArrayList 생성자에 길이를 전달하고 어떤 일이 발생하는지 확인하십시오. – SMA

답변

2

Java의 성능을 실제로 벤치마킹 할 수는 없습니다. 잘못 될 수있는 많은 것들에 대한 자세한 설명은 How do I write a correct micro-benchmark in Java?을 참조하십시오.

만약 내가 jmhtest your code 나는 다음과 같은 결과를 얻을 :

Benchmark      Mode Samples Score Error Units 
c.a.p.SO26404256.arrayList  avgt  5 7.661 ± 0.672 ms/op 
c.a.p.SO26404256.linkedList avgt  5 9.675 ± 1.213 ms/op 

는 그래서 LinkedList의를 채우는 것은 ArrayList를 채우기보다 약간 느린 것 같다,하지만 차이는 테스트가 표시된 것보다 훨씬 적습니다.

차이점은 LinkedList의 각 요소가 Node에 래핑되어 더 많은 개체 생성 및 더 많은 가비지 수집이 이루어 졌기 때문일 수 있습니다. 그리고 ArrayList의 배열 복사본으로 인한 패널티는 아마도 매우 최적화되어 있기 때문에 생각보다 적을 것입니다.

+0

[Oracle Wiki] (https://wikis.oracle.com/display/HotSpotInternals/MicroBenchmarks)의 모든 링크. 관련 링크도 참조하십시오. – dasrohith

관련 문제