SPO600 - 4주차

6521 단어 beginners

이봐,



4주차에는 컴파일러가 코드를 최적화하는 방법을 살펴보았습니다. 우리가 코드를 작성하는 방식은 실제로 컴파일러에 의해 재작성되므로 코드가 최적화된다는 것이 분명해졌습니다.

컴파일러가 수행하는 최적화는 대부분 코드가 동일한 결과를 얻지만 성능이 향상되도록 만드는 것입니다. 그렇게 하기 위해 지금 살펴볼 특정 방식으로 코드를 변경합니다.

프로그래머로서 우리는 이 최적화를 스스로 수행하는 것에 대해 걱정할 필요가 없으며 컴파일러가 자동으로 수행할 것이라고 말하는 것이 중요합니다.

코드 재작성 최적화 정보



컴파일러가 좋아하는 일련의 코드 재작성 최적화 기술이 있습니다: Strength Reduction , Hoisting , Hoisting II - Loop-Invariant Expression , Pre-calculation of Constants 및 기타… 더 많은 것은 위키 페이지here에서 볼 수 있습니다.

강도 감소



우리 모두는 일부 연산이 다른 연산보다 더 광범위하다는 것을 알고 있습니다. 예를 들어 곱셈은 더하기보다 더 광범위합니다.
강도 감소는 더 광범위한 작업을 더 저렴한 작업으로 교체하는 것과 같지만 동일한 결과를 얻을 수 있습니다.

https://wiki.cdot.senecacollege.ca/wiki/Compiler_Optimizations#GCC_Optimization_Options에서 추출한 예를 살펴보십시오.

//BEFORE
int x;
for (x=0; x < 10; x++) {
    printf("%d\n", x*6);
}

//AFTER

int x;
for (x=0; x < 60; x+=6) {
    printf("%d", x);
}



게양



호이스팅에는 루프 외부로 작업을 이동하는 작업이 포함됩니다.
루프 내부의 해당 작업으로 인해 루프 외부에 있었던 것과 동일한 결과가 발생하면 컴파일러는 해당 작업을 외부로 이동합니다.

//For example
for(int i = 0; i  < 5; i++){

var1=0; 
b=b+5;

}

//Will become: 

var1=0;
for(int i= 0; i < 5; i++){

b=b+5;

}



호이스팅 II - 루프 불변 표현식



Hoisting II - Loop-Invariant Expression은 루프 내부에서 확장된 계산을 가져와 한 번만 만들 수 있도록 외부로 가져오면 결과가 이전 위치에 다시 배치됩니다.

예를 들어,

전에:

for(int i = 0; i  < 5; i++){
foo(a, 5*5)
}

//After:
int b = 5*5;
for(int i = 0; i  < 5; i++){
foo(a, b)
}



상수의 사전 계산



상수의 사전 계산은 기본적으로 절대 변경되지 않고 결과로 대체되지 않는 상수 표현식을 얻는 것입니다.

https://wiki.cdot.senecacollege.ca/wiki/Compiler_Optimizations#GCC_Optimization_Options의 예를 참조하십시오.

전에:
ff = (212-32)/100;/* 섭씨-화씨 변환 인자 */
변환 = c * ff + 32;

후에:
전환 = c * 1.800 + 32;

우리wiki에서 읽을 수 있는 것이 많이 있습니다.

내가 배운 것



내가 프로그래머로서 작성하는 코드와 기계어로 변환될 코드는 사실 다르다. 컴파일러는 내가 한 모든 것을 가져와 최적화할 것입니다.

컴파일러는 나보다 똑똑해서 보기 어렵지 않지만 이런 종류의 최적화를 알아서 처리해준다는 것은 좋은 일입니다.

좋은 웹페이지 즐겨찾기