2016-09-10 6 views
0

이러한 배열 내에서 데이터를 교환하려고합니다.신속하고 효율적으로 배열 요소를 전환하십시오.

내 데이터는 다음과 같습니다. 프로덕션 환경에서이 배열은 몇 배 더 커질 수 있습니다.

var data = [ 
    [13.418946862220764, 52.50055852688439], 
    [13.419011235237122, 52.50113000479732], 
    [13.419756889343262, 52.50171780290061], 
    [13.419885635375975, 52.50237416816131], 
    [13.420631289482117, 52.50294888790448] 
] 

현재 내 전환 코드는 다음과 같습니다.

var temp; 

for(var i = 0;i < data.length;i++) { 
    temp = array[i][0]; 
    array[i][0] = array[i][1]; 
    array[i][1] = temp; 
} 

은 내가 알아 내려고 시도하고이 가장 효율적인 방법이 작업을 수행하는 경우 및/또는 개선이 가능합니다.

조금만 개선해도 문제가되지 않습니다.

+1

전환 코드는 요소를 실제로 전환하지 않고 하위 배열의 두 번째 요소를 첫 번째 요소로 옮깁니다. – Matt

+0

'var row = array [i]; '캐싱을 시도 할 수 있습니다. – Xotic750

+1

'data'와'temp'의 결과는 무엇입니까?_ "내가 알아 내려고하는 것은 이것을 가장 효율적으로 수행 할 수있는 방법인가" "가장 효율적"이라고하는 것은 무엇을 의미합니까? 프로세스를 완료하는 데 필요한 최소한의 시간? – guest271314

답변

3

나는 더 많은 기능 접근 방식을 사용 :

var switched = data.map(function (arr) { 
    return [arr[1], arr[0]]; 
}); 

는 ES2015을 사용하는 경우, 당신도 한 줄에 그 작업을 수행 할 수 있습니다 당신은 루프를 고수하려면

const switched = data.map((arr) => [arr[1], arr[0]]); 
+2

의 구조가 더 짧아진다.'data.map (([a, b]) => [b, a])' –

+0

이렇게하면 새로운 배열을 만들어 메모리 풋 프린트를 두 배로 늘릴 수있다. –

+0

@RegisPortalez 의지. 어떤 새로운 배열이 만들어 질 것입니까? 매개 변수 destructuring'[a, b]'는 새로운 배열을 생성하지 않습니다; 단지 매개 변수에서'a'와'b'를 추출합니다. –

0

:

for(var i = 0; i < data.length; i++) { 
    data[i] = [data[i][1], data[i][0]]; 
} 
0

코드가 완벽하게 잘 돌아 갔으므로 "최적화"가 필요하지 않습니다.

은 언제나처럼, 벤치 마크는 항상 빠른 누구인지 찾을 수있는 좋은 방법입니다 :

var arr = (function() { 
 
    var res = []; 
 
    for(var i = 0; i < 100000; ++i) { 
 
     res[i] = [Math.random(), Math.random()]; 
 
    } 
 
    return res; 
 
}()); 
 

 
var swap_in_place = function() { 
 
    for(var i = 0; i < arr.length; ++i) { 
 
     var tmp = arr[i][0]; 
 
     arr[i][0] = arr[i][1]; 
 
     arr[i][1] = tmp; 
 
    } 
 
}; 
 

 

 
var swap_map = function() { 
 
    arr = arr.map(function(elem) {return [elem[1], elem[0]]; }); 
 
}; 
 

 
var runBench = function(name, f) { 
 
    var start = new Date().getTime(); 
 
    for(var i = 0; i < 50; ++i) { 
 
     f(); 
 
    } 
 
    var stop = new Date().getTime(); 
 
    console.log(name + " took: " + (stop - start)); 
 
}; 
 

 

 
runBench("in_place", swap_in_place); 
 
runBench("map", swap_map);
내 파이어 폭스 최신의

(창 10 64), 내가 할 (아주 일관) 16 자리에 대한,지도 버전에 대한 350 대, 즉 12 배 속도를 내려 자신의 버전 대신지도를 사용하여 얻을 의미합니다.

이 스 니펫이 iframe 등에 포함되어 있기 때문에 V8 맨 위에 구축 된 노드 (4.5.0)에서 실행했기 때문에 이것이 같다고 생각할 수 있습니다. 결과 :

enter image description here

나는 지터가 제대로지도 버전에서 함수를 인라인, 또는이 부작용없이 동일한 메모리에서 작동 추론 할만큼 똑똑하지 않을 수 있다고 생각합니다.

  • 다시 복사 Thefore는 지터 역시 다음 함수 호출 (각 반복에서 실속 저장/복원 레지스터를 의미 함)으로 걸쳐 완전한 새로운 중간 결과를 저장하기 위해 배열하고 루프를 할당해야하고, 전체 데이터를 arr
  • 으로 이동하면 (아마도 어떤 일이 일어날 지) 참조 가비지 수집기는 전체 임시 배열을 수집해야합니다.

지도 기능을 사용하면 일시적인 재 할당을 트리거 할 수 있으므로 매우 비쌉니다.

관련 문제