2014-01-12 12 views
1

2 개의 목록을 가지고 있고 요소별로 요소를 추가하고 싶습니다. 그와 마찬가지로 :요소로 목록 요소 2 개 추가하기

enter image description here

는 쉬운 방법 및 첫 번째 목록을 반복하고이 결과 목록에 추가 할 for loop를 사용하는 것보다 well performing way 아마 훨씬 더 있습니까?

답변 해 주셔서 감사합니다.

+1

무엇을 사용하든 관계없이 목록에서 반복해야합니다. 답변을위한 – Maroun

답변

1

나의 이해는 목록 1 및 목록 2를 가지고 당신이 찾을 수있는 가장 좋은 수행 방법을 찾아야 할 것입니다 result[index] = List1[index] + list2[index]

내 주요 제안은 성능 최적화 시작하기 전에에 최적화해야하는지 여부를 측정하는 것입니다 모든. 앞에서 말한 것처럼 목록을 반복 할 수 있습니다.

for(int i = 0; i < listSize; i++) 
{ 
    result[i] = List1[i] + List2[i]; 
} 

대부분의 경우 괜찮습니다. 이 위치가 비싼 위치, 즉 링크 된 목록에 대한 설명은 NPE's answer을 참조하십시오. 또한 this answer을 참조하고 for 루프의 각 단계는 1 단계에서 수행되는 배열을 얻는 것이지만 링크 된 목록에서는 목록의 요소를 반복하는 데 필요한 많은 단계가 수행된다는 점에 유의하십시오 .

표준 배열을 가정하면이 값은 O (n)이며 (배열 크기에 따라 다름) 너무 빨리 수행되므로 성능 프로파일 링이 거의 수행되지 않습니다.

비틀어 짐으로서, 동작이 완전히 독립적이기 때문에 result[0] = List1[0] + List2[0]result[1] = List1[1] + List2[1] 등과는 독립적입니다. 이러한 동작을 병렬로 실행할 수 있습니다. 예 : 하나의 스레드에서 계산의 첫 번째 절반 (< = List.Size/2)을 실행하고 다른 스레드에서 나머지 절반 (> List.Size/2)을 실행하고 경과 시간을 대략 반으로 예상 할 수 있습니다 CPU). 이제 사용할 스레드의 수는 데이터 크기, CPU 수, 다른 작업이 동시에 발생하며 일반적으로 여러 조건에서 테스트하고 모델링하여 결정하는 것이 가장 좋습니다. 이 모든 것이 프로그램에 복잡성을 더 해줍니다. 따라서 제 제안은 간단하게 시작한 다음 측정하고 최적화해야하는지 여부를 결정하는 것입니다.

3

어떤 종류의 목록과 어떤 종류의 루프에 따라 달라집니다.

순회은 요소 (보다는 인덱스)을 통해 거의 확실히 많은만큼 빠르게 될 것입니다.

반면에 인덱스를 반복하고 인덱스로 요소를 반복적으로 가져 오는 것은 특정 유형의 목록 (예 : 링크 된 목록)의 경우 제대로 작동하지 않을 수 있습니다.

+0

Thx! 그러나 "요소"를 반복하여 의미하는 것을 이해하지 못합니다. 당신이 그 예를 들어 주시겠습니까? – user2051347

0

Java에는지도 스타일 기능이 제공되지 않으므로 이러한 종류의 작업을 수행하는 방법은 for 루프를 사용하는 것입니다. 다른 구문을 사용하더라도 루핑은 어쨌든 완료됩니다. 대안으로 계산을 위해 GPU를 사용하고 있지만 이것은 기본 Java 기능이 아닙니다. 또한 배열을 사용하는 것이 연결된 목록을 사용하여 작업하는 것보다 빠릅니다.

1

매트릭스 API (예 : OpenGL)가 있어야만 루핑이 불가피합니다.당신은 원래 목록에 의해 뒷받침되는 List<Integer>을 구현할 수 :

이 복사 작업을 방지하고 스택의 끝에서 계산을 이동
public class CalcList implements List<Integer> { 

    private List<Integer> l1, l2; 

    @Override 
    public int get(int index) { 
     return l1.get(index) + l2.get(index); 
    } 

} 

:

CalcList<Integer> results1 = new CalcList(list, list1); 
CalcList<Integer> results2 = new CalcList(results1, list3); 
// no calculation or memory allocated until now. 

for (int result : results2) { 
    // here happens the calculation, still without unnecessary memory 

} 

이 컴파일러가 경우에 이점을 줄 수있다

for (int i = 0; i < list1.size; i++) { 
    int result = list1[i] + list2[i] + list3[i] + …; 

} 

나는 의심 스럽습니다. 이 구현에 이점이 있는지 알아 보려면 특정 사용 사례에 대한 벤치 마크를 실행해야합니다.