자바 스크립트 스위치 vs. if… else if ... else


143

나는 몇 가지 질문이 있습니다.

  1. switch명령문과 JavaScript 사이에 JavaScript의 성능 차이 가 if...else있습니까?
  2. 그렇다면 왜?
  3. 의 동작입니다 switchif...else브라우저에서 다른가? (FireFox, IE, Chrome, Opera, Safari)

이 질문을하는 이유 switch는 Firefox에서 약 1000 대의 사례가 있는 문장 에서 더 나은 성능을 얻는 것 같습니다 .


편집 불행히도 이것은 내 코드가 아닙니다 .Javascript가 컴파일 된 라이브러리에서 서버 측으로 생성되고 있으며 코드에 액세스 할 수 없습니다. 자바 스크립트를 생성하는 메소드를

CreateConditionals(string name, string arrayofvalues, string arrayofActions)

참고 arrayofvalues는 쉼표로 구분 된 목록입니다.

그것이 생산하는 것은

function [name] (value) {
  if (value == [value from array index x]) {
     [action from array index x]
  }
}

참고 : 여기서 [name]= 서버 측 함수에 전달 된 이름

이제 함수의 출력을 TextArea에 삽입하도록 변경하고 함수를 구문 분석하기위한 JavaScript 코드를 작성하여 case명령문 세트로 변환했습니다 .

마지막으로 함수를 실행하면 정상적으로 실행되지만 IE와 Firefox에서는 성능이 다릅니다.


1
최적의 것을 검사하는 코드 샘플을 제안합니다. 내 말은, 당신이 이것을 요구하는 이유가있을 것입니다. 맞습니까?
jcolebrand

오랜 경험에서 100 케이스 스위치 문이나 100 파트 if / else 시리즈가 좋은 아이디어라고 말한 사례가 거의 없기 때문에 당신이 무엇을하고 있는지 게시하십시오.
Pointy

미안하지만 100 대가 아닌 수천 가지 조건
John Hartsock

2
여러분, 의견을 보내 주셔서 감사합니다. 그러나 내 문제는 실제로 if와 swith 통계의 차이점이 아닙니다. 명령문 내에서 실행되는 코드였습니다. 도움을 위해 모두에게 +1합니다. 불편을 드려 죄송합니다. 때로는 해결책을 찾기 위해 다른 사람과 이야기를 나누기 만하면됩니다.
John Hartsock

답변:


113

일반적인 답변 :

  1. 예, 보통입니다.
  2. 자세한 정보는 여기를 참조하십시오
  3. 예, 각기 다른 JS 처리 엔진이 있기 때문에 아래 사이트에서 테스트를 실행할 때 스위치는 항상 많은 반복에서 if, elseif를 수행했습니다.

시험장


1
: 당신이하는 조건문을 사용하는 경우의 TLDR하려면 여기에 문서의 세그먼트에 대한 직접 링크가 주소입니다 oreilly.com/server-administration/excerpts/even-faster-websites/...이
edhedges

2
@Tommy 좋은 기사, 공유해 주셔서 감사합니다. 그러나이 기사 는 JS에서 switchif/then명령문 사이에 무시할만한 성능 차이가 있다고 언급합니다 . 이 기사는 이것이 드문 드문 switch최적화와 다른 JS 엔진의 다양한 방식 으로 인한 것이라고 설명 합니다. 인용문 :Since most JavaScript engines don’t have such optimizations, performance of the switch statement is mixed.
Jasper

3
이 설명에 수량화 가능한 것이 있습니까? 많은 "모범 사례 / 조기 최적화"추측과 비슷합니다. 또한 7 년 전에 작성되었으므로이 시점에서 자바 스크립트 최적화가 크게 변경되었습니다. 컴파일 된 언어에서이 세 가지 작업의 성능 차이는 "거의 중요하지 않습니다". 실제 성능에 영향을 미치지 않는 것을 최적화하지 마십시오. 가독성을 최적화하십시오.
Thomson Comer

3
@Tommy« 자세한 내용은 여기 »404를 제공합니다.
LogicDaemon

2
@LogicDaemon-IIRC는 일부 JS 성능 고려 사항 / 토론에 관한 oRielly 텍스트 상자의 링크입니다.
Tommy

61

때로는 둘 다 사용하지 않는 것이 좋습니다. 예를 들어, "디스패치"상황에서 Javascript를 사용하면 완전히 다른 방식으로 작업을 수행 할 수 있습니다.

function dispatch(funCode) {
  var map = {
    'explode': function() {
      prepExplosive();
      if (flammable()) issueWarning();
      doExplode();
    },

    'hibernate': function() {
      if (status() == 'sleeping') return;
      // ... I can't keep making this stuff up
    },
    // ...
  };

  var thisFun = map[funCode];
  if (thisFun) thisFun();
}

객체를 생성하여 다 방향 분기를 설정하면 많은 이점이 있습니다. 기능을 동적으로 추가 및 제거 할 수 있습니다. 데이터에서 디스패치 테이블을 작성할 수 있습니다. 프로그래밍 방식으로 검사 할 수 있습니다. 다른 함수로 핸들러를 빌드 할 수 있습니다.

"case"에 해당하는 함수 호출의 오버 헤드가 추가되었지만 특정 키에 대한 함수를 찾기위한 해시 조회의 이점 (많은 경우)입니다.


2
당신의 전략은 좋으며 자주 사용합니다. 그러나 @Michael Geary stackoverflow.com/a/45336805/5936119 에서 지적했듯이 맵 변수는 디스패치 컨텍스트 외부에서 선언해야합니다. 그렇지 않으면 항상 다시 평가됩니다.
다니엘 산타나

@DanielSantana 사실이지만 나는 그것이 상당히 비싸다는 것을 의심합니다. 특히 함수가 처음 구문 분석 되면 텍스트가 정적이므로 코드 자체를 다시 생성 할 필요가 없습니다.
Pointy

18

사이의 성능 차이 switchif...else if...else이다 작은, 그들은 기본적으로 같은 일을. 차이점을 만들 수있는 차이점 중 하나는 테스트 할 표현식이 한 번에 한 번 씩만 평가 switch된다는 것 if입니다. 표현식을 평가하는 데 비용이 많이 든다면 한 번 수행하는 것이 백 번 수행하는 것보다 빠릅니다.

이러한 명령 (및 모든 스크립트)의 구현 차이는 브라우저마다 약간 다릅니다. 다른 브라우저에서 동일한 코드에 대해 다소 큰 성능 차이를 보는 것이 일반적입니다.

모든 브라우저에서 모든 코드의 성능을 거의 테스트 할 수 없으므로 수행중인 작업에 가장 적합한 코드를 찾고 수행 방식을 최적화하는 대신 작업량을 줄여야합니다.


7
  1. 차이가 있다면, 눈에 띄게 충분히 커지지 않을 것입니다.
  2. 해당 없음
  3. 아니요, 모두 동일하게 작동합니다.

기본적으로 코드를 가장 읽기 쉽게 만드는 것을 사용하십시오. 하나 또는 다른 구성이 더 깨끗하고 읽기 쉽고 유지 관리하기 쉬운 곳이 있습니다. JavaScript 코드에서 몇 나노초를 절약하는 것이 훨씬 더 중요합니다.


5
특히 자바 스크립트에서 시맨틱과 가독성 (따라서 유지 보수성) 은 고유 한 브라우저 버전 컴퓨터 하드웨어와 OS 조합 사이 if..else에서 switch발생 하는 현지화 된 성능 차이를 능가 합니다.
jball

2
동의하는지 모르겠습니다. 큰 데이터베이스, 나무를 가로 지르는 등의 루프에서 루프에 사용되는 경우 실제로 눈에 might 수 있습니다.
ghoppe

2
나는 확실히 동의하지 않습니다. 웹 응용 프로그램이 점점 복잡 해짐에 따라이 차이는 응용 프로그램에 중요 할 수 있으며 브라우저에 따라 변경 될 수 있습니다.
joshvermaire

7
중요한 것은 깨끗하고 유지 관리 가능한 코드를 작성하는 것입니다. 성능 문제가 보이는 경우-프로필. 그런 다음 수정할 코드를 결정하십시오. 가정 된 성능 문제에 대한 유지 관리 성을 희생하지 마십시오.
존 베네딕토

3
'다른 경우라면 ...'은 O (n)이고, '스위치'는 O (1) 또는 O (log (n))입니다. 차이가 충분히 클 수 없다는 것을 어떻게 정직하게 진술 할 수 있습니까? 스위치에 백만 건의 사례가 있으며 (코드가 생성되면 쉽게 가능) 가장 적은 말을 분명히 알 수 있습니다.
dragonroot

6

구문 이외에, 스위치가 만드는 나무를 사용하여 구현 될 수있다 O(log n)a가있는 동안, 경우 / 다른 로 구현 될 필요가 O(n)절차 적 접근 방식. 더 자주 그것들은 절차 상으로 처리되고 유일한 차이점은 구문이며, 10K 경우 if / else를 정적으로 입력하지 않는 한, 그것은 실제로 중요합니까?


7 년 후 ... 상수 숫자 값을 사용하는 경우를 제외하고 트리 구현이 어떻게 가능한지 알 수 없습니다).
Ed Staub

4

Pointy의 답변 은 객체 리터럴을 switch또는 if/ 대신 사용할 수 있음을 나타냅니다 else. 나는이 접근법도 좋아하지만 답변의 코드 mapdispatch함수가 호출 될 때마다 새로운 객체를 생성합니다 .

function dispatch(funCode) {
  var map = {
    'explode': function() {
      prepExplosive();
      if (flammable()) issueWarning();
      doExplode();
    },

    'hibernate': function() {
      if (status() == 'sleeping') return;
      // ... I can't keep making this stuff up
    },
    // ...
  };

  var thisFun = map[funCode];
  if (thisFun) thisFun();
}

map많은 수의 항목이 포함되어 있으면 상당한 오버 헤드가 발생할 수 있습니다. 액션 맵을 한 번만 설정 한 다음 매번 이미 생성 된 맵을 사용하는 것이 좋습니다.

var actions = {
    'explode': function() {
        prepExplosive();
        if( flammable() ) issueWarning();
        doExplode();
    },

    'hibernate': function() {
        if( status() == 'sleeping' ) return;
        // ... I can't keep making this stuff up
    },
    // ...
};

function dispatch( name ) {
    var action = actions[name];
    if( action ) action();
}

3

switch 문과 if ... else if .... else간에 Javascript의 성능 차이가 있습니까?

나는 그렇게 생각하지 않는다 . switch여러 if-else조건을 예방하고 싶다면 유용하고 짧다 .

스위치와 if ... else if ... else가 브라우저마다 다르게 작동합니까? (FireFox, IE, Chrome, Opera, Safari)

동작은 모든 브라우저에서 동일합니다 :)


5
switch is useful/short if you want prevent multiple if-else conditions.예, 좋은 소식입니다.
NiCk Newman

1
  1. 경우에 따라 워크 벤치는 약간의 차이가 발생할 수 있지만 처리 방법은 브라우저에 따라 다르므로 귀찮게 할 가치가 없습니다.
  2. 처리 방법이 다르기 때문에
  3. 동작이 달라지면 브라우저라고 부를 수 없습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.