Syncope.T-*
728x90

요즘은 옛날 같지 않아서 CPU나 RAM이 기가 단위를 우습게 알고, HDD는 테라 단위까지 넘보고 있어요.

운영체제도 변화하면서 현재는 한 프로그램에 허용되는 자원이 과거에 비해 매우 풍부해졌지요.

(... -> 16bit -> 32bit -> 64bit -> ... : 발전에 따라 지원하는 메모리 용량 변화)

 

하지만 환경만 발달한 것은 아니에요.

소프트웨어 역시 성장한 소비자의 욕구를 만족 시키기 위해 끝없이 필요 사양을 높여만 왔어요.

게임 시장만 봐도, 고사양의 PC가 등장했다 싶으면 냅다 초고사양 게임을 후려치잖아요! (철썩!)

 

다들 아시다시피 컴퓨터 자원을 효율적으로 사용하는 게임이라면 같은 환경에서도 비교적 뛰어난 성능을 보여주어요.

이것을 자원에 대한 최적화라고 해요.

최적화가 잘 된 대표적인 게임이 바로 블리자드 사의 워크래프트와 스타크래프트에요.

또한 굳이 게임이 아니어도, 훌륭한 프로그램은 사용자의 자원을 낭비해선 안되어요.

고로 어느 정도 규모 있는 프로그램을 제작할 때에는 컴퓨터 자원의 관리에 항상 신경써야만 할거에요.

 

자원 낭비에는 두가지 종류가 있어요. 

첫째는 자원 남용.

둘째는 자원 누수.

 

자원 남용이란 굳이 사용할 필요가 없는 자원까지 사용함을 뜻해요.

2Byte 데이터만 가질 변수에 4Byte 크기를 할당한다거나-

1Byte로 표현될 데이터를 괜히 2Byte로 표현하는 경우가 되겠지요.

응? 몇 Byte 차이는 괜찮지 않냐구요?

글쎄요. 프로그램의 전체 실행 과정 중에서 단지 몇 Byte의 낭비 뿐이라면 문제 없을 거에요.

하지만 이런 낭비가 계속해서 일어난다면, 현실적으로 가능성은 적지만, 할당된 메모리를 전부 써버릴거에요!

 

자원 누수는 자원 남용보다 심각한 상황이에요.

자원 남용이 단순히 프로그램 실행 시간 동안만 일어나는 일인 반면-

자원 누수는 동작이 끝나 종료된 후에도 자원이 반환되지 않는 것이에요.

이 같은 경우에는 그것이 아무리 작은 프로그램에서 시작되었더라도 다른 프로그램의 동작에도 영향을 끼치게 되어요.

  

으음.

 

사실 VB의 기본 내장 함수들만을 사용하여 코딩한다면 자원이 낭비될 일은 있어도 누수될 일은 거의 없어요.

실제 자원 누수가 자주 일어나는 경우는 API를 사용 했을 경우에요.

 

이 글에서는 전자의 경우에서 자원 낭비를 막는 방법을 알아보도록해요!

 

자원 낭비의 대표적인 예는 위에서도 언급했듯이 '적절치 못한 크기의 변수'에요.

아래 코드를 보아주세요. (이와 같은 경우를 고구마의 코드에서 굉장히 많이 볼 수 있어요)

 

Dim i As Long, j As Long
Dim Result As Long
For i = 1 To 10
     For j = 1 To 10
          If Result < i * j Then Result = i * j
     Next j
Next i

 

1부터 10까지의 각각의 값에 다시 1부터 10까지의 값을 곱하여 Result와 비교해요.

결과적으로 Result는 가능한 최대값인 100을 가질거에요.

여기서 Result 변수의 타입을 보아주세요.

As Long은 Result 변수가 4Byte 크기의 정수형으로 선언되었음을 뜻해요.

하지만 아무리 커도 최대치가 100 밖에 되지 않는 Result 변수에 4Byte나 할당하는 것은 낭비에요!

Long 대신 1Byte 크기를 갖는 Byte로 선언한다면 메모리를 4배나 절약할 수 있을 거에요.

 

다음 경우도 보아주세요.

 

Const MAX As Byte = 255
Dim a(1 To 10000) As Boolean
Dim i As Long
For i = 1 To MAX
     a(i) = True
Next i

 

배열 a 중 실제로 사용되는 것은 1부터 MAX(255)까지에요.

하지만 선언 시 배열 a에 할당된 크기는 1부터 10000까지지요!

결국 나머지 용량은 쓸모없이 낭비된 것이에요.

이 경우엔 선언 시에 배열의 최댓값으로 10000이 아닌 MAX를 사용해야 적절해요.

 

자원 낭비를 막는 것은 이렇게 코드의 흐름을 파악해야만 잘 이루어질 수 있어요.

그래서 막무가내 코딩보다는 흐름을 정리한 후에 코딩하라는 말이 있는 것이지요.

 

하지만!

자원을 위한 최적화는 이전 글에서 다룬 속도를 위한 최적화와 충돌할 때도 있어요.

자원을 절약하자니 속도가 떨어지고, 속도를 선택하자니 자원이 낭비되고.

이러한 상황에서는 이후 진행될 프로그램이 동작에 따라 속도나 자원, 둘 중 하나를 선택해야해요.

본 글 첫머리의 내용과 같이 현재에 와서는 자원이 매우 풍부하기에 보통은 속도를 택하지요!

 

다음 글에선 API를 사용하는 상황에서의 자원 절약, 그리고 API를 이용한 자원 절약 방법을 알아보기로해요.

profile

Syncope.T-*

@Syncope

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...