DY N DY

기계적 최적화 하기 본문

PARK/ALGORITHM TIPS

기계적 최적화 하기

손세지 2016. 10. 18. 09:25

이름은 사실 거창하지만... 사실 크게 어려울 것은 없다.

사실 여기 쓰는 모든게 그렇지만 혼자 알아낸것이라기 보다는... 배운 것이므로 배우고나면 어렵진 않다. 스스로 생각해내기는 참 어려울 것 같지만..


우선 이 최적화를 하기 전에는 당연히 선행되어야 할 것이

알고리즘은 완벽하게 구현한 후에 실행하여야 할 것이다. 

모두 구현이 끝난 후에 어떻게하면 조금 더 빠르게 할까..? 생각하면서 하나하나 최적화해나갈 때 필요한 지식이다.

익숙하지 않을 때 처음부터 이런걸 고려한다면 알고리즘 구현도 벅찰수 있을 것 같다.. 

또한 사실 전체 프로그램에서 아래와 같은 것들이 100번이나 1000번정도만 사용된다면 사실 그다지 프로그램의 실행속도향상은 없을 것이다. 

하지만 모으고 모으고 모아서... 100만번 정도의 연산을 아래와 같이 바꾼다고 한다면 상당한 실행속도향상효과가 있을 것이다. 


#일반적으로 좋은 컴파일러를 사용하면 자동으로 최적화하는 기능이 꽤나 많지만... 어느정도의 한계가 있다.


1. ==연산과 >(<)연산의 속도 차이

==연산이 >연산이나 <연산보다 분명히 빠르다. 

물론 차이를 알아보기 위해서는 for loop를 무진장 돌려야 하겠지만 확실하게 빠르다. 

때문에 적절히 잘... 순서를 바꾼다거나 하는 방식으로 조금 더 코드를 빠르게 돌게 할 수 있다.


2. %연산(홀수 짝수 구분)

%연산은 분명히 엄청 느리다. 

이것 또한 for loop를 무진장 돌려보면 느리다는것을 알 수 있을 것이다..

이를 비트연산으로 바꾼다면 속도가 매우 빨라진다.

1과의 AND연산으로 홀수인지 알 수 있다. 

2진수로 나타냈을 때 홀수라면 1의자리가 무조건 1일 것이므로 1과의 &연산에서 1(TRUE)가 나온다면 홀수가 된다. 

1
2
3
4
5
6
7
8
if(i % 2 == 1)
    //홀수 처리
else 
    //짝수 처리
}
cs

위에서

1
2
3
4
5
6
7
8
if(i & 1)
    //홀수 처리
else 
    //짝수 처리
}
cs

이와같이 변경한다면 더 빠르게 될 것이다. 


3. unsigned는 signed보다 연산속도가 빠르다. 

음수가 나오지 않을 것이 확실하다면 unsigned로 한다면 더 빠를 것이다.


4. floating point 연산은 매우 느리다. 

만약 소수 2번째 자리까지 정확도를 유지하기 위해서는 100을 곱해서 int형으로 변환한 다음 연산한다면 더욱 빠를 것이다. 



'PARK > ALGORITHM TIPS' 카테고리의 다른 글

입출력 빠르게 받기 (C, C++)  (0) 2016.10.06
배열 길이 정하기, for문(공통)  (0) 2016.09.29