sourcecode

온도 변수 때문에 프로그램이 느려집니까?

copyscript 2022. 7. 27. 23:53
반응형

온도 변수 때문에 프로그램이 느려집니까?

다음과 같은 C 코드가 있다고 가정합니다.

int i = 5;
int j = 10;
int result = i + j;

번, '루프'를 사용하는 요?int result = 5 + 10예를 들어 두 변수가 인덱스를 계산하기 위해 긴 식을 사용하여 배열에서 가져온 경우 등 코드를 읽기 쉽게 하기 위해 임시 변수를 만드는 경우가 많습니다.C 에 포 c c c c c c?른른른른른른른른?

최신 최적화 컴파일러는 이러한 변수를 최적화해야 합니다. 예를 들어 godbolt에서 다음 예를 사용하는 경우,gcc-std=c99 -O3flags(실시간 참조):

#include <stdio.h>

void func()
{
  int i = 5;
  int j = 10;
  int result = i + j;

  printf( "%d\n", result ) ;
}

그 결과 다음과 같은 어셈블리가 발생합니다.

movl    $15, %esi

산산의 i + j이것은 일정한 전파 형태입니다.

프라이빗을 했습니다.printf 부작용이 생기거나func다음과 같은 용도로 최적화되어 있습니다.

func:
  rep ret

이러한 최적화는 as-if 규칙에 따라 허용됩니다.as-if 규칙에서는 컴파일러가 프로그램의 관찰 가능한 동작을 에뮬레이트하기만 하면 됩니다.이는 초안 C99 표준 섹션에서 다룹니다.5.1.2.3 다음과 같은 프로그램 실행:

추상기계에서 모든 표현은 의미론에 의해 지정된 대로 평가된다.실제 구현에서는 그 값이 사용되지 않고 필요한 부작용이 발생하지 않는다고 추론할 수 있는 경우(함수를 호출하거나 휘발성 객체에 액세스하여 발생하는 부작용 포함)에는 표현의 일부를 평가할 필요가 없습니다.

다음 항목도 참조해 주세요.C++ 코드 최적화 : 연속 폴딩

이것은 컴파일러 최적화용으로 쉽게 최적화할 수 있는 작업입니다.되고 대체됩니다.result15.

SSA 형식의 연속 폴딩은 가장 기본적인 최적화입니다.

당신이 제시한 예는 컴파일러가 최적화하기 쉽습니다.로컬 변수를 사용하여 글로벌 구조 및 어레이에서 추출된 값을 캐시하면 실제로 코드 실행 속도를 높일 수 있습니다.예를 들어 컴파일러가 최적화할 수 없고 값이 변경되지 않는 for 루프 내의 복잡한 구조에서 무언가를 가져오는 경우 로컬 변수는 상당한 시간을 절약할 수 있습니다.

GCC(다른 컴파일러도 마찬가지)를 사용하여 중간 어셈블리 코드를 생성하고 컴파일러가 실제로 무엇을 하고 있는지 확인할 수 있습니다.

그 어셈블리 목록에 여기서 우회는 조치에 대한 논의 있다.읽기 쉬운 어셈블리를 생산하기 위해 GCC가 쓴 거냐?

생성된 코드를 조사하고 컴파일러가 실제로 무엇을 하고 있는지 확인하는 것이 도움이 될 수 있습니다.

반면 코드에 사소한 차이점, 온갖 유형의 여부를 같은 한 이 프로그램의 의미 안 바뀌었네 임시 변수를 사용한다 원칙적으로 그것은 어떤 성능 차이가 없는 가볍게 또는 악화 실적 개선을 위해 방법으로 컴파일러의 행동을 조금도 동욜 수 있다.위해서 가능한 소스(디버깅 목적으로 예를 들어)에 가깝다고 기계 코드 가지 않는 한 의도적으로 최적화를 구축하고 있습니다 좋은 컴파일러,, 또는 이와 유사한 코드는 같은을 만들어 줘야 한다.

내가 편집자가 학습 말하자면, 규칙과 컴파일러의 조립을 출력물을 검사해 사소한 프로그램은 문제를 보여 주기를 만든다, 컴파일러 너 이거 멀리 하도록 했는데 최적화 되어 모든 것을 가지고 있다는 것을 노력하고 있어요 당신은 내가 하는 같은 문제 고통 받고 있다.당신은 main()를 입은 다소 복잡한 수술 본질적으로 영락한다 찾을 수 있다.

push "%i"
push 42
call printf 
ret

당신의 첫 번째 질문은 "이것들은 어떻게 되는가?"가 아닙니다.int i = 5; int j = 10...?" 그러나 "일시 변수에는 일반적으로 런타임 패널티가 발생합니까?"

답은 아마 그렇지 않다.그러나 당신은 당신의 특히는 코드에 대한 어셈블리 출력을 볼 수도 있겠군요.만약 너의 CPU레지스터의 ARM 같은 많이 가지고 있어 i와 j 매우를 레지스터에 있다 싶으면 그 등록하는 직접적으로 함수의 반환 값을 저장하기 같은 가능성이 높다.예를 들어:

int i = func1();
int j = func2();
int result = i + j;

이거 거의 확실히 정확하게 같은 기계 코드:.

int result = func1() + func2();

나는 그들이 지탱하고 유지하는 보다 쉽게 이해할 코드를 당신을 임시 변수를 사용하고, 루프를 강화하려고 애를 쓰고 있다면, 여러분은 어셈블리 출력에 어쨌든 어떻게 가능한 한 많은 공연을 교묘히 하다를 알아내기 위해 찾고 있을 것으로 제안한다.만약 그럴 필요는 없어요 하지만 몇 나노초에 가독성과 유지 관리성을 희생시키지 않는다.

언급URL : https://stackoverflow.com/questions/26949569/do-temp-variables-slow-down-my-program

반응형