본문 바로가기

Studying!!/공부를하자

Code Optimizing

Code Optimizing 1 :시스템 관점에서의 형(type) 선택
Code Optimizing 2 :전역 변수와 지역 변수
Code Optimizing 3 :포인터 체인
Code Optimizing 4 :구조체 정의
Code Optimizing 5 :다중 선택 제어구조
Code Optimizing 6 :카운트 루프
Code Optimizing 7 :루프
Code Optimizing 8 :루프 언롤링
Code Optimizing 9 :switch & lookup table



1. Code Optimizing : 시스템 관점에서 형(type)선택

-normal CRC16


-optimal CRC16


normal의 겨우 형변환 연산을 하는 ANDS를 볼 수 있다. int type의 변수는 4bit, short type의 변수는 2bit,  char type의 변수는 1bit이다. 보통 실제로 쓰이는 비트는 4bit인데, 비트수를 맞추기 위해 불필요한 초기화를 하게 된다.
optimal CRC 16의 경우 실행 속도가 더 빠르게 된다.



2. Code Optimizing : 전역변수와 지역변수

-전역변수를 이용해 연산을 한 경우


-지역변수를 이용해 연산을 한 경우


전역변수를 사용할 경우 branch후에 메모리에서 값을 읽어오고, 다른 곳으로 branch하기 전에 메모리에 레지스터 값을 저장하는 과정이 있음을 알 수 있다. 이에 반해 지역변수를 사용할 경우 기존의 레지스터에서 계속 연산과정이 일어난다. 지역변수를 이용할 경우가 더 빠른 것을 알 수가 있다.



3. Code Optimizing : 포인터 체인

-포인터 그대로 사용


-함수 내에서 공통 포인터 부분 선언 후 사용


두 함수 모두 주소값을 (Object *p) 참조한다. 하지만, 포인터가 가리키는 변수를 별도의 레지스터에 저장하여 참조하는 경우와 그렇지 않은 경우에는 참조하기 위해 한번 로드했던 r1레지스터에 불필요한 반복동작을 한다. 함수 내에서 공통 포인터부분 선언 후 사용하는 것이 더 빠른 것을 알 수 있다.


4. Code Optimizing : 구조체 정의

-구조체 내 변수 타입 순서(무작위 선언)


-구조체 내 변수 타입 순서(크기가 작은 type부터 선언)


구조체  내 변수 타입순서를 크기가 작은 type부터 선언하면, 메모리 공간을 더 효율적으로 쓸 수 있음을 알 수 있다. 구조체 내 변수 타입을 크기가 작은 type부터 선언하는 것이 더 효율적이다.



5. Code Optimizing : 다중선택 제어 구조

- if-else문


- switch-case문


if-else문은 위에서 보는바와 같이 CMP를 하고 조건에 만족하지 않으면 다음 붉은영역의 CMP로 branch하고, 또 조건에 만족하지 않으면 또 다음 붉은 영역의 CMP로 branch한다. 그러나 switch-case문 같은 경우에는 CMP를 하고, 조건에 만족하지 않으면 다음 CMP로 branch하지 않고, 넘어간다. (조건에 맞을 경우에만 해당 주소로 branch한다.) 이럴 경우 조건 절이 많아지게 되면, switch-case문이 더 유용함을 알 수 있다.




6. Code Optimizing : 카운트 루프

-카운트 루프 중 i가 증가할 때


-카운트 루프 중 i가 감소할 때


카운트 루프 변수 i가 증가하는 경우 CMP명령어를 통해 i변수와 CNT로 세팅해놓은 값을 계속 빼는 작업을 한다. 감소하는 경우에는 0인지 아닌지만을 검색한다. 기존의 CNT는 처음에만 세팅한다. 카운트 루프 i가 감소하는 것이 더 실행속도를 빠르게 한다.


7. Code Optimizing : 루프

- for문


- while문


- do-while문


for문의 경우 while문이나 do-while문보다 line 2~3에서 볼 수 잇듯이 CMP명령을 통해 r0와 상수르 비교(즉, 뺄셈)를 하고, 이 차이값이 0일 경우 address 0x14로 branch하는 것을 볼 수 잇다. 그러나 while이나 do-while의 경우 이런 과정이 없다. while, do-while이 실행속도가 더 빠르다. while과 do-while을 각각 쓸 경우 맞춰서 해야함을 알 수 있다.


8. Code Optimizing : 루프 언롤링

- 루프제어 조종 안 한것


-루프 제어 조종 한 것


루프 제어조종을 안 할 경우 1bit AND 연산을 하고 1bit shift하고 다시 branch하는 작업을 통해 루프를 많이 돈다. 이에 반하여 루프 제어조종을 할 경우 1, 2, 4, 8을 차례로 AND 연산을 하고 4bit shift하고 branch하기 때문에 실행 속도가 더 빠르다. 즉, 루프 제어 조종한 것이 실행속도가 더 빠름을 알 수 있다.


9. Code Optimizing : swich & lookup table

- swith-case문


- lookup-table


테이블 참조를 직접 사용하면 subfunction에서의 return 수를 줄일 수 잇다. 또한 각 참조하려는 테이블에 관련되는 pc변환을 일률적으로 명령할 수 있게 되므로 상당한 효율이 생긴다. 맞는 경우라면, 테이블을 이용하는 것이 실행속도가 더 빠름을 알 수 있다.

'Studying!! > 공부를하자' 카테고리의 다른 글

Linux Scheduler 분석  (0) 2008.11.17
어셈블리 strcmp_length strcmp_byte 구현  (0) 2008.10.17
어셈블리 GCD  (0) 2008.10.07
CPU 정보를 보여주는 모듈만들기  (0) 2008.09.26
VI 명령어 모음  (0) 2007.03.17