C 코드최적화 세명대학교 AI연구실 양승조.

Slides:



Advertisements
Similar presentations
03 변수와 자료형 세종대학교 최옥경 교수 참고 : 한빛미디어 뇌를 자극하는 C, INFINITY Perfect C.
Advertisements

멘토링 2 주차 장 프로그래밍을 위한 자바의 자료형  값이 변하지 않는 상수  메모리 기억공간인 변수.
교수님 영상 제 2 장 관세법 일반 제 1 절 통칙 제 2 절 법 해석의 원칙 등 제 3 절 기한과 기간 제 4 절 서류의 송달 등 제 5 절 관세의 부과 및 징수 제 6 절 납세의무의 소멸 등.
YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
C 언어 컴퓨터학과 C 언어 ( STS ) (Chap5. Selection-Making Decisions ) C 언어.
좋은 강의 국제관계학과 정연식.
Vision System Lab, Sang-Hun Han
제 3 장 변수와 자료형.
제 11 장 구조체.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
슬라이드 1~21까지는 각자 복습! 슬라이드 22부터는 수업시간에 복습
Power C++ 제6장 포인터와 문자열.
C 언어 기초 2 위덕대학교 에너지전기공학부 이 수 형 2009년 2학기.
C++ Espresso 제1장 기초 사항.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
제 1장 C 언어의 소개.
C++ Espresso 제2장 제어문과 함수.
14주차 1교시 강화계획 [학습목표] 1. 강화계획의 정의를 안다 [학습내용] 1. 단순한 강화계획 2. 간헐적 강화 3. 복합 계획 4. 선택과 대응법칙 [사전학습] 강화계획이 일어날 수 있는 사례를 생각해본다.
연장근로와 야간·휴일근로 김영호 노무사 나눔 노사관계연구소 소장 연세대 일반대학원 박사 수료 고려사이버대 법학과 외래교수
2014 ITA 8월 강의 C Programming -1주차- C언어 기초 정대진 ( )
쉽게 풀어쓴 C언어 Express 제13장 구조체 C Express Slide 1 (of 25)
C로 쉽게 풀어쓴 자료구조 © Copyright 생능출판사 2005
쉽게 풀어쓴 C언어 Express 제13장 구조체 C Express.
2주 실습강의 Java의 기본문법(1) 인공지능연구실.
제3장 추가 실습 3장 관련 C 언어 프로그래밍 실습.
Chapter 03 배열, 구조체, 포인터.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
제5장 제어명령
Choi, Namseok Java 기초 (Java의 제어문과 배열) Choi, Namseok
스택(stack) SANGJI University Kwangman Ko
FND (Flexible Numeric Display)
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
C 9장. 구조체 #include <stdio.h> int main(void) { int num;
Chapter 4 – 연 산 자 Outline 4.1 산술 연산자 4.2 관계 연산자 4.3 동등 연산자 4.4 논리 연산자
18장. 헤더 파일과 구현 파일 01_ 헤더 파일과 구현 파일의 사용.
C ++ 프로그래밍 시작.
제 2 장 변수와 상수.
제 3 장 상수와 변수
임베디드 시스템을 위한 C프로그래밍 기법 3.7 ~ 4.5 장 Raphael.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
adopted from KNK C Programming : A Modern Approach
Chapter 2 Lexical Elements, Operators, and the C System
컴퓨터 개론 및 실습 Dept. Computer Eng. Hankuk University of Foreign Studies
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
과학 탐구 토론 대회 1학년 2반 박승원 1학년 5반 권민성.
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
제어문 & 반복문 C스터디 2주차.
4장 - PHP의 표현식과 흐름 제어-.
선택 정렬 #define SWAP(x, y, t) {(t) = (x); (x) = (y); (y) = (t);}
■ 화성공장 산학인턴 버스 노선 확인 안내 문의 전화 : 안내페이지 접속 1
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
마이크로소프트 박종호.
작성일 참고서적 – Programing Game AI by Example
C언어 프로그래밍의 이해 Ch05. 명령문.
3장,4장 발표 서정우.
쉽게 풀어쓴 C언어 Express 제6장 조건문 C Express Slide 1 (of 28)
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 08. 조건에 따른 흐름의 분기.
C언어 프로그래밍의 이해 Ch03. 기본 자료형, 변수와 상수.
반복문의 기능 반복문 반복문 특정 영역을 특정 조건이 만족하는 동안에 반복 실행하기 위한 문장 while문
제5장 디버깅과 추적 문봉근.
캡슐화 (Encapsulation) 두원공과대학 소프트웨어개발과 이 원 주.
DataScience Lab. 박사과정 김희찬 (화)
printf("Global Korea\n");
Choi Younghwan CSE HUFS
배열, 포인터, 함수 Review & 과제 1, 2.
PHP 기초문법 PHP를 공부하는데 있어 가장 기초가 되는 PHP기초문법에 대해서 배워 봅니다.
Ch.11. 이진영상처리를 이용한 영상인식.
Presentation transcript:

C 코드최적화 세명대학교 AI연구실 양승조

1. 소개 모바일 프로그래밍 PC에서도 메모리의 용량도 높아지고 속도도 더욱 더 빨라지고 있으나 역시 최적화가 필요하다 일정 수준의 품질을 유지하면서 자원을 덜 차지하고 빠른 속도로 처리되는 프로그램을 개발 해야함 PC에서도 메모리의 용량도 높아지고 속도도 더욱 더 빨라지고 있으나 역시 최적화가 필요하다

2. 어디에 필요한가? 각각의 모듈 중 어느 모듈이 느리게 작동하는가? 메모리를 많이 차지하는가?를 알아내는 것이 중요하다. Visual c++ Profiler (함수별 소비시간 측정) 리눅스 gpof, profiler 루프 혹은 third party 라이브러리 매서드를 호출하는 영역

3. 정수 사용해야 할 값이 음수를 사용하지 않는다면 unsigned int 를 사용해야 한다. 연산 시간 float > int > unsigned int

4. 나눗셈 & 나머지 나눗셈 연산은 피하는 것이 좋다. a/b > c -> a > b*c

5. Combining division and remainder int func_div_and_mod (int a, int b) {         return (a / b) + (a % b);     } 나눗셈 function을 컴파일러에 결합하는 것이 좋다. 나눗셈 function은 항상 나눈값과 나머지를 리턴하기 때문에 나누기와 나머지의 결합

6. 2의 배수로 나누기 나누기를 할 때 2의 배수를 분자화 함으로써 효율적으로 만듬 나누기 대신 shift를 할 수 있기 때문 Ex> 66으로 나눠야 한다면 64로 나눌 수 있도록 Shift를 하더라도 signed보다 unsigned가 더 오래걸린다. 부호비트 때문에 연산이 한번 더 들어감

7. 배열을 이용한 index 생성 if ( queue == 0 )    letter = 'W'; else if ( queue == 1 )    letter = 'S'; else letter = 'U'; static char *classes="WSU"; letter = classes[queue];

8. 나머지 연산자의 대체 uint modulo_func1 (uint count) {    return (++count % 60); } uint modulo_func2 (uint count) {    if (++count >= 60)   count = 0;   return (count); } 위 코드에서 if문이 더욱 빠르다

9. 전역 변수 전역 변수의 사용을 줄여야 한다. 전역 변수의 접근을 줄이는 코드 전역 변수는 레지스터에 할당할 수 없다. int f(void); int g(void); int h(void); int errs; void test1(void) {   errs += f();   errs += g();   errs += h(); } void test2(void) {   int localerrs = errs;   localerrs += f();   localerrs += g();   localerrs += h();   errs = localerrs; } 전역 변수의 사용을 줄여야 한다. 전역 변수는 레지스터에 할당할 수 없다. 전역 변수의 접근을 줄이는 코드

10. Using Aliases void func1( int *data ) {       int i;      for(i=0; i<10; i++)      {             anyfunc( *data, i);      }   } void func1( int *data )   {       int i;       int localdata;       localdata = *data;       for(i=0; i<10; i++)       {           anyfunc ( localdata, i);       }   } 위 코드는 변화가 없는 변수임에도 불구하고 루프문을 통해서 계속 접근하고 있다. 지역변수를 써 줌으로써 해결이 가능하다

11. 지역 변수 가능하면 char이나 short를 사용하지 않도록 한다. 8비트 혹은 16비트를 할당한 후 남는 비트를 줄이는 작업을 추가로 하기 때문 int wordinc (int a) {    return a + 1; } short shortinc (short a) {     return a + 1; } char charinc (char a) {     return a + 1; } 이렇게 32비트로 연산을 하도록 함수를 만들 필요가 있다. 이것은 RISC의 장점과 일맥상통한다.

12. 포인터 구조체를 그대로 넘길 경우 구조체의 모든 값을 넘기지 말고 포인터를 넘길 수 있도록

13. Pointer chains typedef struct { int x, y, z; } Point3; typedef struct { Point3 *pos, *direction; } Object; void InitPos1(Object *p) {    p->pos->x = 0;    p->pos->y = 0;    p->pos->z = 0; } 포인터를 사용할 때 여러 번 그 변수에 접근 하지 말고 지역변수에 넣어 놓은 후 접근하면 레지스터나 캐시를 이용하기 때문에 좀 더 효율적으로 작동한다. 코드가 보기 좋다는 이점도 있다. void InitPos2(Object *p) {    Point3 *pos = p->pos;    pos->x = 0;    pos->y = 0;    pos->z = 0; }

15. Binary Breakdown if(a==1) { } else if(a==2) { } else if(a==3) { } else if(a==4) { } else if(a==5) { } else if(a==6) { } else if(a==7) { } else if(a==8) { } if(a<=4) {     if(a==1)     {     }  else if(a==2)  {     }  else if(a==3)  {     }  else if(a==4)   {       } } else {     if(a==5)  {     } else if(a==6)   {     } else if(a==7)  {     } else if(a==8)  {     } } 이진 트리와 비슷한 형식으로 비교횟수가 현저하게 떨어진다 필요에 따라서 3중 if문으로 만들 수도 있는데 좀 더 빠르게 작동 하겠지만 코드가 보기 어려워 진다.

16. Switch 대신 lookup table 를 사용하라 char * Condition_String1(int condition) {   switch(condition) {      case 0: return "EQ";      case 1: return "NE";      case 2: return "CS";      case 3: return "CC";      case 4: return "MI";      case 5: return "PL";      case 6: return "VS";      case 7: return "VC";      case 8: return "HI";      case 9: return "LS";      case 10: return "GE";           default: return 0;   } } char * Condition_String2(int condition) {    if ((unsigned) condition >= 15) return 0;       return       "EQ\0NE\0CS\0CC\0MI\0PL\0VS\0" +        3 * condition; }

17. 루프 많은 경우 루프에서 과다한 시간을 소비하게 된다. 여러번 실행되는 루프틔 특성상 조그마한 시간의 낭비가 게속 누적되기 때문이다.

17.1 Loop termination int fact1_func (int n) {     int i, fact = 1;     for (i = 1; i <= n; i++)       fact *= i;     return (fact); } int fact2_func(int n) {     int i, fact = 1;     for (i = n; i != 0; i--)        fact *= i;     return (fact); }

17.2 더욱 빠른 for 문 함수는 호출되기 위한 오버헤드가 분명 존재한다. 그래서 반복문안에 함수 호출을 넣는 것보다 함수 안에서 반복문을 쓰는 것이 좋다.

17.3 Early loop break 우리는 흔히 루프가 마지막까지 돌지 않아도 되는데 브레이크를 시키지 않는 경우가 많다. 브레이크를 사용해 쓸 데 없는 루프를 없애자.

18. 함수 디자인 가능한 인자를 줄여라 인자가 4개를 넘어가면 스택을 통해서 넘기기때문에 그만큼 메모리 접근이 발생한다. 구조체의 포인터를 넘기는 법도 가능하고 좋다. __inline키 워드를 이용하면 일종의 매크로 처럼 작용을 하며, 함수가 호출되는 대신 함수의 본체가 직접 치환이 되어 버린다.