2012-03-15 2 views
-1

Google에 입력하는 방법을 모르겠습니다. 여기에서 요청하는 것입니다.다른 운영자가 다른 CPU 사용량을 가지고 있습니까?

프로그래밍에서 운영자는 다른 시간 또는 CPU 사용량을 차지합니까? 예를 들면 다음과 같습니다

x = y * z 

:

x = y + z 

시간의 적은 양/이상의 CPU를 가지고?

전혀 눈에 띄지 않습니다. 그냥 호기심 많은 질문.

또한 모든 일반 연산자와 함께 + =, - =, * = 및/=과 같이 가능한 많은 연산자를 포함 할 수있는 경우.

감사합니다.

+0

연산자의 성능은 데이터 유형 등에 따라 크게 달라질 수 있습니다. 아마도 이진 산술, 부동 소수점 계산 등을 검색 할 수 있습니다. – joshuahealy

답변

3

너무 많은 가변성이 있기 때문에 모든 언어, 데이터 형식, CPU 등에 대한 마스터 목록이 없습니다.

일부 언어에서 연산자는 동적으로 결정된 유형 지정 파견 함수 호출에 대한 문법적 설탕이므로 "a + b"는 몇 분이 걸리는 복잡한 함수 호출이 될 수 있습니다. "a * b"는 밀리 초가 걸리는 간단한 함수 호출 또는 그 반대의 경우.

컴파일 타임 유형이 고정되어있는 언어 (C++ 및 C++에 과부하가 있음에도 불구하고 C를 포함하여)에서는 컴파일 할 때 무엇이 ​​호출 될지 결정할 수 있습니다. 여전히 최종 답을주지는 않습니다. (Dan D와 Alex의 답변도 참조하십시오.)

"확장 연산자"(+ = 등등)는 일반적으로 확장 작업 후 할당의 단축형입니다. 실제 작업에는 동일한 시간이 소요됩니다. 동적 유형 디스패치 (dynamic type dispatch)를 사용하는 언어에서는 보충 연산이 변수의 유형을 한 번만 조회해야하므로 보조 (비 연산자) 작업을 생략하는 경우가 있습니다. 정적 (컴파일 타임) 타이핑을 사용하면 컴파일러가 상당히 똑똑하고 단순한 a += b 유형의 작업은 런타임에 a = a + b 이상의 내용을 저장하지 않으므로 읽기가 쉽습니다. p->q->r->s += t과 같은 더 복잡한 경우는 (까다로운 경우에) p->q->r->s 평가가 반복적으로 작성되면 반복적으로 수행되어야하므로 실제로 시간을 절약 할 수 있습니다.

는 기본 CPU 작업에 관해서는, 엄지 손가락의 몇 가지 규칙이 있습니다,하지만 당신은 사람이 적용되는 확인하기 위해 적절한 CPU 매뉴얼을 운반 할 수 있습니다

정수, 덧셈, 뺄셈, 그리고 논리 연산을 위해
  • like 및/또는/xor는 다른 연산보다 느리지 않습니다.
  • 정수의 경우 곱셈은 더하기보다 "더 어렵습니다"즉, 더하기보다 느릴 수 있지만 충분한 CPU가있는 한 여전히 매우 빠를 수 있습니다 - 그것에 전념 한 힘; 나누기가 곱셈보다 느리거나 여전히 빠름
  • 부동 소수점 연산의 경우 더하기와 빼기가 곱셈과 나눗셈보다 "어렵습니다"따라서 느려질 수 있습니다 부동 소수점은 FPU 전용 임)
  • FPU가없는 경우 부동 소수점은 정수보다 느립니다.
  • 배럴 또는 퍼널 시프터가있는 경우 시프트가 항상 빠르지 만 그렇지 않은 경우에는 시프트가 더 오래 걸릴 수 있습니다 (예를 들어, x >> 4는 x >> 1보다 느릴 수 있습니다.)
  • 최신 CPU의 경우, 위에서 언급 한 @Alex 명령어 스케줄링은 명령어의 순서에 따라 달라질 수 있습니다. , 도움이 될 수 있습니다.
  • 캐시 효과 (캐시 라인의 특정 지점 근처에 분기를 배치하는 것은 물론 다중 레벨 캐시 누락 및 TLB 누락을 포함하여)는 영향을 완전히 막을 수 있습니다 일부 CPU에서 신중한 명령어 스케줄링 수행

이러한 종류의 것들은 최신 컴파일러 최적화 프로그램을 작성하는 것을 매우 까다롭게 만듭니다. :-)

1

예, 최저 수준 인 경우 a * ba + b 이상이며 때로는 다른 방식입니다. 사용 된 하드웨어와 사용 된 언어에 따라 다릅니다.

직접 확인해보십시오. 몇 번의 테스트를 반복하면 몇 천 번 반복됩니다.

+0

감사하지만 어딘가에서 연산자 목록을 찾을 수 있습니다. 시간 사용법? 그렇지 않다면, 나는 당신이 말한 것을하고 여러 테스트 XD를 실행할 것입니다. –

1

CPU 매뉴얼을 확인하고 실행중인 논리 및 산술 명령과 실행주기를 확인해야합니다.

정수 나눗셈 또는 곱셈에 대한 지침이 없으면 프로그래밍 언어는 더 원시적 인 것들 (예 : 교대 및 더하기/빼기)을 사용하여 이러한 연산을 구성해야합니다. 덧셈, 뺄셈, 비교, 쉬프트, xor, 비트 반전과 같은 long 정수에 대한 간단한 연산에도 똑같이 적용됩니다. 긴 정수를 사용하여 이러한 작업을 수행하는 지침이 없으면 더 짧은 정수를 사용하여 구성해야합니다. 즉, 연산자 성능은 관련 유형의 크기에 따라 달라집니다.

일부 CPU에는 부동 소수점 연산에 대한 지침이 없습니다. 즉, 모든 부동 소수점 연산은 정수에서 작동하는 명령어를 사용하여 구성해야하므로 정수에서 비슷한 연산보다 상대적으로 느립니다.

고려해야 할 또 다른 사항은 해당 명령어가 CPU에서 다른 명령어와 쌍을 이룰 수 있는지 (페어링 (병렬 실행)이 가능한 경우) 여부입니다. 쌍을 이룰 수 없다면, 주변의 응급 처치법을 늦출 것입니다. 일부 CPU는 동시에 실행될 수있는 간단한 명령어에 대해 여러 개의 ALU를 가지고 있습니다. 간단한 페어링 외에도 일부 복잡한 명령어는 CPU 파이프 라인의 더 많은 스테이지를 사용하거나 간단한 명령어와 다르게 사용하여 다른 간단한 명령어의 실행을 지연시킬 수 있습니다.

궁극적 인 대답은 CPU 및 프로그래밍 언어/컴파일러/인터프리터에 따라 다릅니다.

관련 문제