(x < 0)과 (x == -1) 중 어느 것이 더 빠릅니까?
변수 x
값을 .진을한 int.-1, 0, 1, 2, 3
( 틱 식 중에서 것은 입니까? CPU 틱(tick)에서 더 빠른 표현은 무엇입니까?
1. (x < 0)
2. (x == -1)
언어: C/C++, 하지만 다른 언어들은 다 똑같을 것 같습니다.
으로 그 이 라고 합니다. 저는 개인적으로 그 대답이(x < 0)
.
구루들을 위한 더 광범위한: 만약에x
-1
2^30
?
이것은 전적으로 당신이 컴파일하려는 ISA와 당신의 컴파일러 옵티마이저의 품질에 달려있습니다.섣불리 최적화하지 마십시오. 먼저 프로파일을 작성하여 병목 지점을 찾습니다.
경우에 둘다을 알 수 있습니다., x86 의 하게 을 에서는 을 모두 우가두다가두두na우ne(l,usr'h )cmp
) 및 점프jCC
) .) 지침.하지만, 에 대해서는(x < 0)
가 , 가 을 의 이 을 이 가 의 cmp
한 번의 주기로 코드 속도를 높여주는 명령어입니다.
으로, 이 이 x
:에며술산근예(산예술:s에 :add
, 아니면sub
, 하지만 더 많은 가능성이 있습니다) EFLAGS 레지스터에 기호 플래그 SF를 설정하는 경우에는cmp
어,고지를 a할다수는ta다t할수t지어를는,na,을js
설명.간단한 일은 없습니다.jCC
입력이 -1일 때 점프하는 명령어.
한번 해보세요.백만, 혹은 그보다 더 나은 것들을 각각 10억씩 해보세요.여러분의 결과에는 통계적인 의미가 없다고 장담하지만, 여러분의 플랫폼과 컴파일러에서는 결과를 찾을 수 있을지도 모릅니다.
이것은 섣부른 최적화가 아마도 여러분의 시간적 가치가 없을 것이며, 적어도 프로그래밍에서 "모든 악의 근원"일 수도 있다는 것을 스스로에게 확신시키기 위한 훌륭한 실험입니다.
두 작업 모두 단일 CPU 단계에서 수행할 수 있으므로 동일한 성능을 유지해야 합니다.
x < 0 이 더 빠릅니다.다른 경우가 아니라면 상수 -1을 피연산자로 가져오는 것을 방지합니다.대부분의 아키텍처에는 0과 비교하기 위한 특별한 지침이 있으므로 이 또한 도움이 될 것입니다.
비교를 선행하거나 성공하는 작업에 따라 달라질 수 있습니다.예를 들어, 비교를 수행하기 직전에 x에 값을 할당한 경우 특정 값과 비교하는 것보다 기호 플래그를 확인하는 것이 더 빠를 수 있습니다.또는 어떤 비교를 선택하느냐에 따라 CPU의 분기 예측 성능이 영향을 받을 수도 있습니다.
그러나 다른 사람들이 말했듯이, 이것은 CPU 아키텍처, 메모리 아키텍처, 컴파일러 및 기타 많은 것에 의존하기 때문에 일반적인 답은 없습니다.
어쨌든 중요한 고려 사항은 실제로 프로그램 흐름을 정확하게 지시하는 것이고, 어떤 것이 같은 결과를 만들어 내느냐는 것입니다.
x가 실제로 있고 열거형의 인덱스 또는 값이라면 -1은 항상 원하는 것이 될까요, 아니면 음의 값이 될까요?지금 당장은 -1이 유일한 마이너스지만 바뀔 수도 있습니다.
이 질문에 문맥에 맞지 않게 대답할 수도 없습니다.사소한 마이크로벤치마크를 사용하려고 하면 옵티마이저가 코드를 에테르로 옮길 가능성이 있습니다.
// Get time
int x = -1;
for (int i = 0; i < ONE_JILLION; i++) {
int dummy = (x < 0); // Poof! Dummy is ignored.
}
// Compute time difference - in the presence of good optimization
// expect this time difference to be close to useless.
마찬가지로 두 작업 모두 보통 1시간 안에 이루어집니다.
아키텍처에 따라 다르지만 x == -1은 오류가 발생하기 쉽습니다.x < 0이 선택입니다.
다른 사람들이 말했듯이 아마도 아무런 차이가 없을 것입니다.비교는 CPU에서 매우 기본적인 동작이므로 칩 설계자들은 가능한 한 빨리 비교하기를 원합니다.
하지만 당신이 고려할 수 있는 다른 것이 있습니다.각 값의 빈도를 분석하고 순서대로 비교합니다.이를 통해 몇 번의 주기를 절약할 수 있습니다.물론 이것을 확인하기 위해서는 여전히 코드를 컴파일해야 합니다.
당신은 이것이 정말 시간을 끄는 것이라고 확신합니다.
기계에 문의하면 우리 중 누구도 할 수 있는 것보다 더 신뢰할 수 있는 답변을 얻을 수 있을 것 같습니다.
당신이 말하는 것과 같은 암호에서도 시간이 어디로 가는지 알고 있었다는 저의 추측이 정확하지 않다는 것을 발견했습니다.예를 들어 이것이 내부 루프에 있는 경우, 컴파일러에 의해 삽입된 보이지 않는 함수 호출이라도 있다면 해당 호출의 비용이 단연 압도적일 것입니다.
니콜라이, 이렇게 적으세요
실제로 고부하 프로그램의 병목 현상을 일으키는 연산자입니다.이 1-2열의 성능은 가독성보다 훨씬 더 가치가 있습니다.
모든 병목 현상은 일반적으로 이 정도로 작으며, 완벽한 알고리즘을 갖춘 완벽한 설계에서도 마찬가지입니다(그렇지는 않지만).저는 고부하 DNA 처리를 하고 제 분야와 알고리즘을 잘 알고 있습니다.
그렇다면 다음 작업을 수행하지 않는 이유는 무엇입니까?
- 타이머를 가져와 0으로 설정합니다.
- (x < 0)으로 고부하 프로그램을 컴파일합니다.
- 프로그램과 타이머를 시작합니다.
- 프로그램 종료 시 타이머를 보고 결과 1을 기억합니다.
- 1과 동일한
- (x == -1)로 고부하 프로그램을 컴파일합니다.
- 3과 동일한
- 프로그램 끝에서 타이머를 보고 결과2를 기억합니다.
- 결과1과 결과2를 비교합니다.
정답을 알게 될 겁니다.
언급URL : https://stackoverflow.com/questions/912256/what-is-faster-x-0-or-x-1
'programing' 카테고리의 다른 글
세션에 목록 저장 (0) | 2023.09.08 |
---|---|
문자열을 문자별로 반복하는 방법 (0) | 2023.09.08 |
워크시트의 "마지막" 셀 강제 새로 고침 (0) | 2023.09.08 |
목표 C에서 'int' 배열의 길이 (0) | 2023.09.08 |
Spring Data에서 동일한 QueryDSL 경로에 대해 여러 개 (0) | 2023.09.08 |