Language/C

C - 1초 딜레이에 관하여

ShinyOcean 2021. 10. 1. 01:03

 

안녕하세요 : )

shinyocean 입니다.

 

이번 포스팅에서 다루어볼 것은 딜레이 함수에 대한 이야기 입니다

 

저는 이번학기 대학교 설계 과목으로 마이크로 프로세서 응용 설계 라는 과목을 수강하게 되었습니다. 해당과목은 티바 보드라는 ARM사의 실습보드와 C 언어를 이용해 자유롭게 임베디드시스템 하드웨어를 디자인하는것입니다.

 

그런데 오늘 실습에서 LED 토글과 관련해서 딜레이 함수를 구현하는것을 다루게 되었습니다.

 

평소 딜레이 함수가 필요할때는 window.h의 sleep함수나 time.sleep과 같은 잘 짜여진 라이브러리를 이용해왔습니다.

 

티바보드의 경우 컴파일된 파일을 보드에서 실행하는 것이 아닌, 보드에 컴파일 칩셋이 내장되어있어서

보드 내에서 컴파일하고 실행되는 형식이었습니다.

그래서 그런지 해당보드를 사용할때는 stdlib와 같은 헤더파일을 사용할수 없었습니다.

 

결국 시간 딜레이를 사용하려면 직접만드는 방법밖에 없었습니다.

 

그럼 어떻게 구현하는것일까? 했는데 솔루션은 되게 당연하면서도 황당했습니다.

 

sum=0

for(int i=0;i<13333333;i++){

sum+=1

}

 

위와같은 무의미한 연산을 13333333번 가량 수행하면 그 실행 시간이 1초 가량 걸리기때문에 위처럼 반복문을 돌리는 것 이었습니다.

 

처음 C프로그래밍을 배울때는 아무런 궁금증없이 헤더파일에 잘 구현되어있는 sleep함수를 사용했었는데

이번 설계때 저런 방식으로 구현해서 사용하니 흥미로워 글로 남겨보게 되었습니다.

 

근데 여기서 끝나면 재미가 없으니까!

저렇게 무의미 한 연산을 통해 딜레이를 만들 때와 라이브러리에 내장된 함수를 사용하여 딜레이를 만들때 메모리 사용량과 실행시간을 비교하는 실험을 해보겠습니다.

 

메모리 사용측정에는 파이썬 psutil 라이브러리의 메소드를 사용했고 시간측정은 timeit라이브러리를 사용했습니다. 코드는 다음과 같습니다.

 

 

1. 1초 라는 시간이 될때까지 비교연산을 반복하여 수행한 코드

 

2. 라이브러리를 사용한 코드

 

 

결과는 예상대로 라이브러리를 사용한 코드의 메모리 사용량이 4~5배정도 적었습니다. 딜레이의 크기가 커질수록 공간복잡도 측면에서 효율은 대폭 상승할것 같습니다.

하지만 재미있는 부분은 두가지 방법으로 만든 1초에 근접한 딜레이가

소수점 6자리까지의 시간으로 표현된 결과로 비교시 매번 정확히 일치했습니다.

 

lab.1

lab.2

 

 

lab.3

 

어떤 방식으로 time라이브러리의 sleep 메소드가 구현되어있는지는 잘 모르겠으나

"1초 만들기" 라는 목표는 비슷하게 구현되었으니 만족스러운 실험이었습니다.

 

 

전체 실험 코드)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import timeit
import psutil
import time
 
 
def delay_lap():
    p = psutil.Process()
    p.memory_info()
    def memory_usage(message: str = 'debug'):
        # current process RAM usage
        p = psutil.Process()
        rss = p.memory_info().rss / 2 ** 20 # Bytes to MB
        print(f"[{message}] memory usage: {rss: 10.5f} MB")
 
    memory_usage('#1')
 
    strat_time = timeit.default_timer()
    while True:
        terminate_time = timeit.default_timer()
        if terminate_time-strat_time>=1:
            break
 
    print("방법1의 메모리 사용량 : #2-#1")
    memory_usage('#2')
 
    strat_time = timeit.default_timer()
    time.sleep(1)
    terminate_time = timeit.default_timer()
 
    print("방법2의 메모리 사용량 : #3-#2")
    memory_usage("#3")
 
 
    print("방법1의 실행시간 결과")
    print("%f 초 소요"%(terminate_time-strat_time))
    print("방법2의 실행시간 결과")
    print("%f 초 소요"%(terminate_time-strat_time))
    print(sum)
 
if __name__ == "__main__":
    delay_lap()
 
cs

 

 

마치며

제 3학년 2학기도 어느덧 시작한지 한달차가 되어가고 있습니다. 대학교에 처음 입학했을때만하더라도 빨리 졸업하고싶다는 생각은 전혀 하지 않았었는데 요즘은 변화가 생기는것 같습니다. 남은기간 열심히 준비해서 피지컬을 늘리고 실전에 투입되고 싶은것 같습니다 ㅎ

 

그 감기 백신도 2차 접종을 일주일 앞두고있는데 이제 그래도 세상이 조금은 정상적으로 돌아오고 있는것 같습니다. 앞으로 제 블로그 방문자님들도 건강조심하시고 몇달 남은 이번해에 열심히 노력하셔서 원하시는 목표 다들 이루셨으면 좋겠습니다. 저는 또 다음에 흥미로운 주제를 가지고 돌아와보겠습니다! 감사합니다