[Language-agnostic] "IF"가 비싼가요?


Answers

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

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

Question

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

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

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

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




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

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

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




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

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

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




많은 사람들이 지적한 바와 같이 조건부 브랜치는 현대 컴퓨터에서 매우 느릴 수 있습니다.

즉, if 문에는 존재하지 않는 많은 조건부 분기가 있습니다. 컴파일러가 무엇을 생각해 낼지 항상 알 수 없으며, 기본 구문이 얼마나 오래 걸릴지 걱정하는 것은 사실상 항상 잘못된 것입니다 할 것. (컴파일러가 안정적으로 생성 할 것을 알 수 있다면 좋은 최적화 컴파일러가 없을 수도 있습니다.)




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

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

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




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

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

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

수업에서 행운을 빈다.

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




어쩌면 분기가 CPU 명령어 프리 페치를 죽일 수 있습니까?




분명히 비효율적이지 않은 명확하고 단순하며 깨끗한 방법으로 프로그램을 작성하십시오. 그것은 가장 비싼 자원을 최대한 활용합니다. 프로그램을 작성하거나 나중에 디버깅 (이해가 필요한 경우)하십시오. 성능이 충분하지 않은 경우 병목 현상이 발생한 위치를 측정 하고이를 완화하는 방법을 확인하십시오. 극히 드문 경우에만 개인 (소스) 지침에 대해 걱정해야합니다. 성능은 첫 번째 줄에서 올바른 알고리즘과 데이터 구조를 선택하고,주의 깊게 프로그래밍하며, 충분히 빠른 기계를 얻는 것입니다. 좋은 컴파일러를 사용하면 최신 컴파일러를 재구성하는 코드를 볼 때 놀랄 것입니다. 성능을위한 코드 재구성은 일종의 최후의 수단이며, 코드는 복잡해지고 (버그가 많음), 수정하기가 어려워지고 따라서 비용이 많이 듭니다.