"else if"가 "switch () case"보다 빠릅니까? [복제]
가능한 중복 :
C #에서 if / else와 switch-case를 사용하는 것 사이에 큰 차이가 있습니까?
저는 현재 C #을 배우고있는 전직 파스칼 사람입니다. 내 질문은 다음과 같습니다
아래 코드는 스위치를 만드는 것보다 빠릅니까?
int a = 5;
if (a == 1)
{
....
}
else if(a == 2)
{
....
}
else if(a == 3)
{
....
}
else if(a == 4)
{
....
}
else
....
그리고 스위치 :
int a = 5;
switch(a)
{
case 1:
...
break;
case 2:
...
break;
case 3:
...
break;
case 4:
...
break;
default:
...
break;
}
어느 것이 더 빠릅니까?
내 프로그램은 비슷한 구조를 가지고 있기 때문에 묻습니다 (많은 "else if"문). 스위치로 바꿔야합니까?
몇 가지 항목의 경우 차이가 작습니다. 많은 아이템이 있다면 반드시 스위치를 사용해야합니다.
스위치에 5 개 이상의 항목이 포함 된 경우 조회 테이블 또는 해시 목록을 사용하여 구현됩니다. 즉, 모든 이전 항목을 먼저 평가해야하므로 마지막 항목에 도달하는 데 훨씬 많은 시간이 걸리는 if : s 목록과 비교하여 모든 항목의 액세스 시간이 동일합니다.
왜 신경 쓰나요?
시간의 99.99 %, 당신은 걱정하지 않아야합니다.
이러한 종류의 미세 최적화는 코드 성능에 영향을 미치지 않을 것입니다.
또한 관리가 필요한 경우 코드에서 성능 프로파일 링을 수행해야합니다. 이 경우 스위치 케이스와 if-else 블록의 성능 차이를 찾는 것이 쉽지 않습니다.
편집 : 명확성을 기하기 위해 : 더 명확하고 유지 보수가 쉬운 디자인을 구현하십시오. 일반적으로 거대한 스위치 케이스 또는 if-else 블록에 직면하면 솔루션은 다형성을 사용하는 것입니다. 변화하는 행동을 찾아 캡슐화하십시오. 이전에 이와 같이 거대하고 추악한 스위치 케이스 코드를 다루어야했지만 일반적으로 단순화하기가 어렵지 않습니다. 그러나 오 너무 만족.
이 성능 평가를 믿으면 스위치 케이스가 더 빠릅니다.
이것이 결론입니다.
결과는 switch 문이 if-else-if 래더보다 실행 속도가 더 빠름을 보여줍니다. 컴파일러가 switch 문을 최적화 할 수 있기 때문입니다. if-else-if 래더의 경우, 코드는 프로그래머가 결정한 순서대로 각 if 문을 처리해야합니다. 그러나 switch 문 내의 각 사례는 이전 사례에 의존하지 않기 때문에 컴파일러는 가장 빠른 실행을 제공하는 방식으로 테스트 순서를 다시 지정할 수 있습니다.
고려해야 할 또 다른 사항 : 이것은 실제로 응용 프로그램의 병목 현상입니까? 이런 종류의 최적화가 실제로 필요한 경우는 매우 드문 경우입니다. 대부분의 경우 알고리즘과 데이터 구조를 다시 생각하여 속도를 향상시킬 수 있습니다.
나는 스위치가 갈 길이라고 말하고 싶습니다. 그것은 더 빠르고 더 실용적입니다.
( http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx ) 와 같이 두 가지를 비교하는 벤치 마크 테스트를 보여주는 다양한 링크가 있습니다 .
테스트하기 어려워서는 안되며, 5 개의 숫자 사이에서 전환하거나 ifelse가있는 함수를 만들고, 그 함수에 rand (1,5)를 던지고 타이밍 동안 몇 번 반복하십시오.
컴파일러가 점프 테이블을 생성 할 수 있기 때문에 스위치는 일반적으로 긴 if 목록보다 빠릅니다. 목록이 길수록 일련의 if 문보다 switch 문이 더 좋습니다.
기술적으로는 동일한 결과를 생성하므로 거의 같은 방식으로 최적화 할 수 있어야합니다. 그러나 컴파일러가 if보다 점프 테이블을 사용하여 스위치 케이스를 최적화 할 가능성이 더 높습니다.
나는 일반적인 경우에 대해 이야기하고 있습니다. 5 개 항목의 경우 조건에 따라 빈도를 가정 할 경우 if에 대해 수행 된 평균 테스트 수는 2.5보다 작아야합니다. 매우 빡빡한 루프가 아니라면 집에 쓸 병목이 거의 없습니다.
가독성 문제는 스위치의 성능 이점 (상대적으로 약간이지만 주목할만한 가치)보다 훨씬 중요합니다.
나는 if 체인에 비해 의도와 순수한 공백이 매우 분명한 switch 문을 발견했습니다.
확실하지 않지만 사용중인 프로그래밍 언어에 따라 하나 또는 다른 속도가 변경된다고 생각합니다.
나는 보통 스위치를 사용하는 것을 선호합니다. 그렇게하면 코드를 읽는 것이 더 간단 해집니다.
switch
가능한 경우 일반적으로 컴파일러가 룩업 테이블로 변환합니다. 따라서 임의의 사례를 찾는 것은 실제로 원하는 사례를 찾기 전에 몇 가지 사례를 비교하는 대신 O (1)입니다.
따라서 많은 경우 if
/ else if
체인이 느려집니다. 하지만 사건 발생 빈도에 따라 차이가 없을 수 있습니다.
짧은 대답 : 스위치 문이 더 빠릅니다
if 문은 올바른 절을 얻기 위해 평균적으로 두 가지 비교 (예제 코드를 실행할 때)가 필요합니다.
switch 문은 평균 비교 횟수가 몇 가지 사례에 관계없이 하나인지를 나타냅니다. 컴파일러 / VM은 컴파일시 가능한 옵션에 대한 "조회 테이블"을 만들었습니다.
이 코드를 자주 실행하면 가상 머신이 유사한 방식으로 if 문을 최적화 할 수 있습니까?
switch
명령문은 if
/ else
chain 과 동일한 의도를 표현 하지만 더 제한적이고 공식적인 방식으로 표현 하기 때문에 첫 번째 추측은 컴파일러가 코드에 배치 된 조건에 대해 더 많은 결론을 도출 할 수 있기 때문에 컴파일러가 더 잘 최적화 할 수 있어야한다는 것입니다. 즉, 하나의 상태 만 참일 수 있으며, 비교되는 값은 기본 유형입니다.) 이것은 런타임 성능을 위해 두 개의 유사한 언어 구조를 비교할 때 매우 안전한 일반적인 사실입니다.
http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.switch%28VS.71%29.aspx 참조
switch 문 기본적으로 조회 테이블에는 알려진 옵션이 있으며 if 문은 부울 유형과 같습니다. 나에 따르면 스위치와 if-else는 동일하지만 논리 스위치의 경우 더 잘 도울 수 있습니다. if-else는 읽기에서도 이해하는 데 도움이됩니다.
참고 URL : https://stackoverflow.com/questions/767821/is-else-if-faster-than-switch-case
'Programming' 카테고리의 다른 글
Gemfile에서 로컬 젬을 어떻게 지정할 수 있습니까? (0) | 2020.03.02 |
---|---|
msysgit의 오른쪽 클릭 메뉴 옵션을 어떻게 제거합니까? (0) | 2020.03.02 |
Windows에서 PYTHONPATH에 추가하여 모듈 / 패키지를 찾는 방법은 무엇입니까? (0) | 2020.03.02 |
Android는 EditText에 자리 표시 자 텍스트 추가 (0) | 2020.03.02 |
쿼리 문자열 매개 변수를 추가하거나 업데이트하려면 어떻게합니까? (0) | 2020.03.02 |