[If-Statement] "IF"가 비싼가요?



Answers

"비싸다"는 용어는 특히 " if "문과의 관계에서 매우 중요합니다. 왜냐하면 조건의 비용도 고려해야하기 때문입니다. 이는 몇 가지 간단한 CPU 지침에서부터 원격 데이터베이스를 호출하는 기능의 결과 테스트까지 다양합니다.

나는 그것에 대해 걱정하지 않을 것이다. 임베디드 프로그래밍을하고 있지 않는 한, " if "의 비용을 전혀 신경 쓰지 않아도됩니다. 대부분의 프로그래머에게는 앱의 성능을 좌우하는 요소 될 수 없습니다.

Question

나는 선생님이 그 날에 정확히 무엇을 말했는지 기억하지 못합니다. 아마도 당신이 알기를 희망합니다.

이 모듈은 "데이터 구조 및 알고리즘"이며,

if 문은 가장 비싼 [뭔가]입니다. [무언가] [무언가]를 등록합니다.

그래, 나는 끔찍한 기억이있어 정말 미안하지만 몇 시간 동안 인터넷 검색을 해봤는데 아무 것도 나오지 않았다. 어떤 아이디어?




CPU는 깊게 파이프 라인되어 있습니다. 모든 브랜치 명령 (/ for / while / switch / 등)은 CPU가 다음에로드하고 실행할 명령을 실제로 알지 못한다는 것을 의미합니다.

CPU가 무엇을해야하는지 알기를 기다리는 동안 멈추거나 CPU가 추측합니다. 구형 CPU의 경우 또는 추측이 잘못되었을 경우 파이프 라인 정지가 발생하여 올바른 명령을로드해야합니다. CPU에 따라 이것은 10-20 지시 값만큼 높은 실속이 될 수 있습니다.

최신 CPU는 양호한 분기 예측을 수행하고 동시에 여러 경로를 실행하고 실제 경로 만 유지함으로써이를 피하려고합니다. 이것은 많은 도움이되지만 지금까지 갈 수 있습니다.

수업에서 행운을 빈다.

또한 실생활에서이 점에 대해 걱정해야한다면, OS 디자인, 실시간 그래픽, 과학적 컴퓨팅 또는 비슷한 CPU 기반의 작업을 수행하고있을 것입니다. 걱정하기 전에 프로필.




ALU 사용면에서 가장 비쌉니까? 비교할 값을 저장하기 위해 CPU 레지스터를 사용하고 if 문이 실행될 때마다 값을 가져 와서 비교하는 데 걸리는 시간을 사용합니다.

그러므로 최적화는 하나의 비교를 수행하고 루프가 실행되기 전에 결과를 변수로 저장하는 것입니다.

그냥 누락 된 단어를 해석하려고합니다.




이것이 내가 말할 수있는 유일한 상상은 if 문이 일반적으로 브랜치를 생성 할 수 있다는 사실입니다. 프로세서 아키텍처의 세부 사항에 따라 분기가 파이프 라인 실속 또는 최적이 아닌 다른 상황을 유발할 수 있습니다.

그러나 이것은 극히 상황에 따라 다릅니다. 대부분의 최신 프로세서는 분기 예측에 부정적인 효과를 최소화하려고합니다. 또 다른 예는 ARM 아키텍처 (및 다른 것들)가 조건부 논리를 처리 할 수있는 방법입니다. ARM은 명령 수준 조건부 실행을 가지므로 단순한 조건부 논리로 인해 분기가 발생하지 않습니다. 조건이 충족되지 않으면 명령이 단순히 NOP로 실행됩니다.

모든 말 -이 물건에 대해 걱정하기 전에 논리를 수정하십시오. 잘못된 코드는 얻을 수있는만큼 최적화되지 않았습니다.




나는이 한 마디에 대해 내 친구와 한 번 만났습니다. 그는 매우 순진한 원 알고리즘을 사용하고 있었지만, 광산이 사용했기 때문에 그의 것보다 더 빠르다고 주장했습니다 (원의 1 / 8을 계산하는 종류). 결국, if 문은 sqrt로 대체되었고 어떻게 든 더 빠릅니다. 아마도 FPU에 sqrt가 내장되어 있기 때문입니까?




또한 루프 내부에서 반드시 값 비싼 것은 아닙니다 .

현대 CPU는 if 문을 처음 방문 할 때 "if-body"를 가져 오거나 (또는 ​​다른 방법으로 말하면 루프 본문을 여러 번 가져온다고 가정합니다) (*) 것으로 가정합니다. 두 번째 및 이후 방문시, CPU (CPU)는 Branch History Table 을 조사하여 마지막으로 상태를 확인할 수 있습니다 (사실입니까? 마지막으로 거짓이었던 경우, 추측 실행은 if 또는 루프 이상으로 "else"로 진행합니다.

(*) 규칙은 실제로 " 앞으로 가지 않은 가지, 뒤로 가지가지 채취 한 "것입니다. if 문에서, 조건이 거짓으로 평가되면 [if] 본문 뒤 의 점으로의 [앞으로] 점프 만 있습니다 (기억 : CPU가 분기 / 점프를 취하지 않는다고 가정).하지만 루프 루프 이후의 위치로의 앞으로의 브랜치 (branch)가 될지도 모르고, 리피터 (recettern)가 걸리면 뒤로가는 브랜치 (branch)도있을 수있다.

이것은 또한 가상 함수 또는 함수 포인터 호출에 대한 호출이 많은 가정 ( http://phresnel.org/blog/ )보다 더 나쁘지 않은 이유 중 하나이기도합니다.




셀 성능에 대한 분기 제거통한 성능 향상 기사를 확인하십시오. 또 하나 재미있는 것은 실시간 충돌 감지 블로그에서 분기없는 선택관한이 게시물 입니다.

이 질문에 대한 답변으로 이미 게시 된 우수 답변 외에도 "if"문이 값 비싼 저수준 작업으로 간주되어 더 높은 수준의 환경에서 분기없는 프로그래밍 기술을 활용하려고 시도하고 있음에도 불구하고 스크립팅 언어 또는 비즈니스 로직 계층 (언어와 상관없이)과 같은 언어는 부적절 할 수 있습니다.

대다수의 시간, 프로그램은 먼저 명확성을 위해 쓰여지고 성능 초에 최적화되어야합니다. 성능이 가장 중요한 문제 영역이 많이 있지만, 대부분의 개발자가 렌더링 엔진의 핵심 부분 또는 몇 주 동안 실행되는 고성능 유체 역학 시뮬레이션에 사용하기위한 모듈을 작성하지 않는다는 단순한 사실이 있습니다. 솔루션의 최우선 과제가 "제대로 작동"할 때 가장 중요한 것은 코드의 조건문 오버 헤드를 줄일 수 있는지 여부입니다.




최신 프로세서는 긴 실행 파이프 라인을 가지고 있기 때문에 여러 단계의 명령이 동시에 여러 단계에서 실행됩니다. 다음 명령이 실행되기 시작하면 한 명령의 결과를 항상 알 수는 없습니다. 조건부 점프 (if)를 실행하면 명령 포인터가 어떤 방향으로 가야 하는지를 알기 전에 파이프 라인이 비어있을 때까지 기다려야 할 때가 있습니다.

나는 긴화물 열차라고 생각한다. 직선으로 많은화물을 신속하게 운반 할 수 있지만 심하게 모퉁이를 만듭니다.

펜티엄 4 (프레스콧)는 31 단계의 유명한 파이프 라인을 보유하고 있습니다.

Wikipedia 에 대한 추가 정보




Links