본문 바로가기
코딩/C 언어

c언어 코드 최적화 5장. 함수 호출 최적화

by DIYver 2020. 10. 15.

C언어 최적화에 대해서 벌써 마지막 장이다.

(사실은 더 많은 방법이 있지만, 가장 큰 차이가 존재하는 것들을 위주로 다뤄보았다.)

지금까지 C언어 코드 최적화 포스팅을 정독했다면 컴퓨터에대한 원리를 이해했을 것이다.

 

 

 

 

이번에 다뤄볼 최적화 방법은 함수 호출과 관련이 있다.

함수 호출은 사용자 정의 함수를 main()  이나 다른 함수에서 호출하여 사용하는 것을 말한다.

 

예를 들면, 아래와 같은 경우가 함수 호출의 예가 되겠다.

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int sum(int a, int b)
{
	return a + b;
}

void main()
{
	int a = 5;
	int b = 7;

	printf("%d + %d = %d \n ", a, b, sum(a, b));
	return;
}

main( ) 함수에서 사용자 정의함수인 sum( )을 호출해서 사용하고 있다.

 

이 과정을 우리의 실생활로 돌아와서 접근해 보자.

우리가 영어책을 읽을때, 모르는 단어가 있으면 사전을 찾고 그 뜻을 이해한 다음 해석을 계속 이어나간다.

우리가 영어 단어를 다 알고 해석을 시작했으면 금방 했을 것이다.

하지만 모르는 경우 해석하는데 시간이 오래 걸리게 된다.

 

컴퓨터 연산도 똑같다고 보면 된다.

sum( ) 이라는 함수가 무엇인지 모르니, 정의되어 있는 부분으로 가서 그 코드를 확인하고 연산을 한다음에 본 코드를 실행한다.

이렇게 되면 당연히 시간이 오래걸릴 수 밖에 없다.

 

 

 

1. 함수 호출은 엄청 느리다.

 

과연 시간 차이가 얼마나 발생하는지 실제 코드 테스트를 통해서 알아보도록 하자.

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int sum(int a, int b)
{
	return a + b;
}

void main()
{
	clock_t start, end;
	float res;
	start = clock();
	
	int result = 0;

	for (int i = 1; i <= 100000000; i += 2)
	{
		result += sum(i, i + 1);
	}

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

	end = clock();
	res = (float)(end - start) / CLOCKS_PER_SEC;

	printf("\n소요시간 : %.3f \n", res);
	return;
}

위의 코드는 3장에서 다뤘었던 코드와 같은 코드이다.

다만 사용자 정의함수를 통해서 덧셈을 외부에서 하는 것을로 변경하였다.

 

과연 소요시간은 어떻게 나왔을까?

 

와... 1.171  초가 소요되었다.

 

이전의 결과들과 비교해보면 엄청난 차이임을 알 수 있다.

 

사용자 정의함수를 사용하지 않고, 내부에서 더하게 된 경우를 살펴보자.

 

위의 코드는 반복도 본문의 경우보다 5천 만번 더 하게 되었음에도 아래처럼 시간이 적게 걸렸다.

 

0.239초...

 

이 경우 반복 횟수를 동일하게 했다면, 0.140초가 된다.

 

 

그렇다면 사용자 정의함수를 호출한 경우는 내부에서 연산한 것과 비교한다면 약 8배 정도 느리다고 할 수 있다.

 

따라서 함수 호출은 되도록 사용하지 않는 것이 좋다.

제일 최악의 상황은 위와같이 반복문 안에서 함수 호출을 사용하는 경우이다.

반복 횟수가 많고, 함수 자체 연산 처리가 오래걸린다면 연산처리 속도가 엄청나게 느려질 것이다.

 

 

 

 

그렇다면 함수호출은 필요한데, 다른 대안은 없나? 라고 생각을 해보자.

 

 

2. 매크로 함수를 이용하자.

 

앞에서 영어책을 읽을때, 모르는 단어가 있으면 사전 찾느라 시간이 걸린다 했었다.

그렇다면 단어를 미리 다 알고 있었다면 시간이 얼마 걸리지 않을 것이다.

매크로 함수가 바로 그런 느낌이다.

 

매크로 함수가 무엇이냐면 #define 으로 정의한 함수가 매크로 함수이다.

위에서 사용한 사용자 정의 함수를 매크로 함수로 선언하면 아래와 같다.

매크로 함수에는 특이하게도 자료형을 붙이면 안 된다.

이렇게 하면 sum(a, b) 라는 매크로 함수가 만들어지게 되고, 함수처럼 사용하면 된다.

 

 

 

그렇다면 전체 코드를 확인해보고

실제로 얼마나 시간단축이 일어나는지 테스트해보자.

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define sum( a, b) a+b


void main()
{
	clock_t start, end;
	float res;
	start = clock();
	
	int result = 0;

	for (int i = 1; i <= 100000000; i += 2)
	{
		result += sum(i, i + 1);
	}

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

	end = clock();
	res = (float)(end - start) / CLOCKS_PER_SEC;

	printf("\n소요시간 : %.3f \n", res);
	return;
}

코드는 위에처럼 매크로 함수로 sum( ) 을 정의해주었다.

실행결과는 놀랍게도 비교적 빠르게 처리되었다.

 

0.123초가 소요되었는데, 이 소요시간은 반복문 안에서 사칙연산을 실행한 결과와 같은 수치라 볼 수 있다.

 

이 결과로 알 수 있는 것은,

이렇게 간단한 연산의 함수는 사용자 정의 함수로 만들 것이 아니라

매크로 함수로 만들어서 사용하는 것이 더 깔끔하고 연산시간도 단축시킬 수 있다는 것이다.

 

 

 

 

 

 

 

 

결론은 

1. 사용자 정의함수를 호출하는 것은 느리므로, 꼭 함수화가 필요한지 따져보자.

2. 간단한 함수는 매크로 함수를 만들어서 사용하는 것이 좋다.

 

 

 

 

 

<이전 글>

1.  c언어 코드 최적화 1장. 나눗셈을 사용하지 말자.

 

c언어 코드 최적화 1장. 나눗셈을 사용하지 말자.

C언어는 오랜 역사를 갖고 있으며, 더 발전한 C++ 언어 역시 많은 곳에서 사용되고 있다. 특히 컴퓨터보다는 제한된 성능의 기계에서 사용하고는 한다. 보통 우리는 임베디드 시스템이라고 부른��

diyver.tistory.com

2. C언어 코드 최적화 2장. 비트연산을 사용하자.

 

C언어 코드 최적화 2장. 비트연산을 사용하자.

C언어 코드 최적화 방법은 여러가지가 있다. 이전에 나눗셈을 사용하지 않는것을 다뤄봤었다. 이번에는 비트연산을 사용하는 것이 얼마나 빠르게 코드를 작동시키는지 다뤄보도록 하자. 비트(bi

diyver.tistory.com

3 .c언어 코드 최적화 3장. LOOP 최적화

 

c언어 코드 최적화 3장. LOOP 최적화

코드를 짜다보면 반복문은 무조건 사용하게 되어있다. 그런데 이 반복문 연산속도가 빠른놈이 아니다. 1. 반복문은 연산속도가 느리다. 반복을 하게되면 연산속도가 늦다는 것인데, 예를 들면 1�

diyver.tistory.com

4. C언어 코드 최적화 4장. 조건문 최적화

 

c언어 코드 최적화 4장. 조건문 최적화

C언어 최적화에는 여러가지 고려해야 할 것들이 많다. 이번에는 조건문에서의 최적화를 다뤄보도록 하자. 1. 조건문은 비교연산 횟수를 줄여야 한다. 우리가 흔히 사용하는 조건문은 if 조건문이

diyver.tistory.com

 

댓글