2016-08-17 1 views
1

보다 더 효율적 사항 Array.indexOf 수있는 방법 : indexOf with multiple arguments이 질문은이 질문에 대한 경쟁 답변에서 영감 사항 Array.some

는 사용자가 하나 이상의의 존재에 대한 배열을 테스트하는 효율적인 방법을 알고 싶어 배열에 주어진 정수. 특히 배열과 숫자 123, 124125이 주어진 경우 주어진 배열에 하나 이상의 정수가 있는지 어떻게 알 수 있습니까? 두 솔루션을 제안했다 :

indexOf() 사용 :

var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 
var exists = array.indexOf(123) !== -1 || array.indexOf(124) !== -1 || array.indexOf(125) !== -1; 

또는를 some()를 사용하여 :

var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 
var exists = array.some(function(item) { 
    return item === 123 || item === 124 || item === 125; 
}); 

모두 indexOf()some() 단락의 ECMA-262 알고리즘을 성공적으로 경기를 발견, 하지만 일치가 없을 때 some() 구현이 더 빠를 것이라고 생각했을 것입니다. 그러나 다른 사용자는 indexOf() 솔루션 is faster을 지적했습니다.

indexOf() 코드는 배열을 여러 번 반복해야하지만 코드가 더 효율적입니까?

+1

'.indexOf'는 함수 호출의 오버 헤드가 없기 때문에 상상할 수 있습니다. 'some'은 아마도 더 큰 배열에 대해 더 효율적일 것입니다. – Blender

+3

'Array.prototype.indexOf'는 요소가 발견되지 않으면'-1'을 반환하고'=== 0'은 의도 한 것이 아니며'! == -1 '이어야한다고 가정합니다 – ASDFGerte

+1

다른 브라우저 사용 , 테스트를 여러 번 실행하면 결과가 달라집니다. Chrome 52에서는 test2가 빠릅니다. Firefox 50에서는 test1이 빠릅니다. 그 중 하나가 다른 것보다 빠르다는 것이 확실하지 않습니다. – noKid

답변

3

문제는 귀하의 질문이 표준 자체에 의존하지 않고 표준 구현 방법에 크게 의존한다는 것입니다.

결과는 다른 엔진간에 일치하지 않을 수 있습니다.

일부 엔진에서는 "함수를 호출하는 오버 헤드가 있습니다"라는 매우 분명한 가정은 함수 호출 및 기타 까다로운 최적화를 인라이닝함으로써 완화 될 수 있습니다.

간단히 말해서 대답은 하나도 없으며 ES 구현 + 런타임 세부 정보 (CPU 명령/opcode, 최적화 사용)에 대한 참조를 사용하지 않는 대답은 단순히 추측입니다.

관련 문제