2014-10-22 3 views
0

에라토스테네스 접근 방식을 사용하여 지정된 한도 내에서 소수를 합치려고합니다. 데이터 저장/수행을위한 배열과 객체의 사용을 비교하기 위해 필자는 두 가지 기능을 썼다. 객체 함수의 체 부분이 배열 함수의 체 부분보다 더 오래 걸리는 것을 발견했습니다. 왜 이런거야? 어쩌면 이해할 수없는 기본 구조의 근본적인 특징이 있습니까? 대용량 데이터가있는 JavaScript 배열 대 객체

typeof [] === "object" //true 

그래서 아니, 당신은 아무것도 언어 현명한 실종되지 않습니다 자바 스크립트 배열에서

function sumOfPrimesUsingArray(limit) { 
    var primeArray = [], 
     i, 
     j, 
     sum; 

    //Crete array filled with values 
    for (i = 2; i < limit; i += 1) { 
     primeArray[i] = i; 
    } 

    //Perform the sieve 
    for (i = 2; i < limit; i += 1) { 
     if (primeArray[i] !== 0) { 
      for (j = primeArray[i] + primeArray[i]; j < limit; j += primeArray[i]) { 
       primeArray[j] = 0; 
      } 
     } 
    } 

    //Sum with a loop 
    sum = 0; 
    for (i = 2; i < limit; i += 1) { 
     sum += primeArray[i]; 
    } 


    return sum; 
} 

그리고 코드의 개체 버전 ...

function sumOfPrimesUsingObject(limit) { 
    var primeObject = {}, 
     i, 
     j, 
     sum, 
     primes; 

    //Create object filled with values 
    for (i = 2; i < limit; i += 1) { 
     primeObject[i] = i; 
    } 

    //Perform the sieve (takes forever) 
    for (i = 2; i < limit; i += 1) { 
     if (primeObject[i] !== undefined) { 
      for (j = primeObject[i] + primeObject[i]; j < limit; j += primeObject[i]) { 
       delete primeObject[j]; 
      } 
     } 
    } 

    //Sum with a loop 
    sum = 0; 
    for (primes in primeObject) { 
     if (primeObject.hasOwnProperty(primes)) { 
      sum += primeObject[primes]; 
     } 
    } 
    return sum; 
} 
+0

근본적으로 배열이 연속 숫자 인덱스의 오브젝트보다 효율적인 이유는 무엇입니까? 이거 놀랍 니? 더 일반적인 목적의 객체보다 구체적으로 설계된 것보다 어레이가 더 좋을까요? – jfriend00

+0

배열은 정수 인덱스에 최적화되어 있습니다. 'delete'ing 속성은 매우 비쌉니다. 'primeObject [j] = undefined'를 사용하여 다른 실행을 시도해보십시오. – Bergi

+0

글쎄, 배열은 확실히 최고의 옵션입니다. 여전히 사용중인 작업은 다릅니다. 다음은 객체가있는 최적화 된 예제입니다. 차이가 1.5-2 배가되는 것을 볼 수 있습니다. http : //jsfiddle.net/pfn1knmn/ – juvian

답변

0

는 개체입니다.

아마도 최적화는 데이터 구조의 부적절한 사용 결과와 달리 런타임에서 발생합니다.

관련 문제