블로그 이미지
관리할 시간이 별로 없다는 핑계 제출중... sbin

카테고리

sbin story (32)
who is sbin (0)
sbin's equipment (2)
C language (8)
travel (0)
ubuntu (8)
Mac (3)
book & sentence (11)
헛소리.. (0)
Total52,144
Today4
Yesterday8
 이번 장에서는 스왑 기술을 다루겠습니다.
 모두가 알고 있는 기술이죠. 프로그램을 배우면서 여러번이나 반복 학습한 기술입니다. 간단하죠. 두개의 변수가 가지고 있는 데이터를 상호교환합니다.

void swap(int &a,int &b){
	int temp;
	temp	= *a;
	*b	= *a;
	*b	= temp;
}

 기본형은 위와 같고 정말 간단한 함수 입니다. 헌데 이게 왜 거창하게 프로그래밍 스킬 씩이나 될까요?
 프로그래밍 스킬이 되는 이유는 바로 사용법에 있습니다.
 우린 수많은 프로그래밍 기술을 배우게 됩니다. c, c++을 하며 포인터를 다루는 법이나 구조체 등을 다루는 법을 배우고, 자바를 배우면 객체 지향을 배우게 됩니다. 머 요즘은 객체 지향이 아닌 목적지향이 대세죠..^^
 헌데 우린 이렇게 배워온 스킬을 전혀 사용하지 않는 경향이 있습니다.
 위의 swap이 대표적이라고 할 수 있습니다.

 그럼 swap을 사용하는 대표적 구조가 무엇일까요?
 전 위에서 목적지향을 언급했습니다. 이때 필요 하죠 우린 필요에 의해서 일정 변수를 전역으로 지정하고 사용하게 됩니다. 다른 파일에선 볼수 없는 변수 이지만 파일 내부에선 사용이 자유롭죠.
 이 파일 안에 펑션 A가 있습니다. 그런데 이녀석은 전역 변수 b를 사용하는 군요 그런데 우리는 A와 같은 기능을 하되 b와 형태가 같은 c변수를 가지고 실행 하길 바랍니다.
 이때 A를 다시 전역 변수가 아닌 전송 받은 녀석으로 처리하게 변경하는 방법이 많이 사용 됩니다. 하지만 이는 속도 저하를 불러오게 됩니다. 자신이 연산하는게 외부에도 보내준 주소를 이용하는 것이라고 하면 일정 언어에서는 속도가 저하되게 되죠. 이를 보완하는 방법이 swap입니다. 그냥 b와 c의 형태가 같으니 연산전에 둘을 교체해두고 연산후 다시 교체하면 되는 일이죠.
 여러 반론이 나올수 있습니다. 우선은 가장 큰 반론 "우아한 퇴보" 컴퓨터는 만들어 지고 난뒤 가장 큰 이슈가 항상 일하게 하는 것이었죠. 하지만 컴퓨터의 발전은 너무 빨랐고 사람들은 이 이슈를 포기했습니다. 이걸 "우아한 퇴보" 라고 하죠. 즉 컴퓨터는 사용자 보다 연산이 빠르고 그렇기 때문에 사용자의 입력을 기다린다. 입니다. 실제로 이는 많은 분야에서 타당합니다. 우리는 동영상을 시청하면서 웹서핑도 하죠 이는 컴터가 두가지를 모두 처리할 수 있을 정도로 빠르기 때문입니다. 이런 컴터를 사용하는데 왜 프로그래머가 고작 1,2초를 줄일려고 더 힘든길을 택하는가 이죠.
 이는 프로그래머들 사이에서는 충분히 큰 이슈죠. 1.컴터가 빨라졌는데 왜 속도 최적화를 해야 하는가 차라리 보완이 쉽게 하자. 아니다 2.그래도 우리는 사용자를 위해 빠른 프로그램을 짜야한다. 전 눈치 채셨겠지만 후자 입니다.
 전 의공학쪽을 하거든요. 그 중에서도 방사능, 혹은 울트라 비전의 장비들에 이미징이 전문 입니다. 그렇다 보니 한번의 구동에 엄청난 시간을 할애하거든요.
 이런 분야는 저뿐만이 아닐 것입니다. 영상 공학쪽이나 네트워크는 짧은 시간 안에 많은 일을 해야하죠. 그렇기 때문에 우린 우아한 퇴보 든 머든 빨라야 한다는 것입니다.
 이게 이번 장에서 제가 말하고자 하는 첫번째 쾌속화입니다. 그럼 두번째 이번엔 시간 보장입니다. 이도  swap을 쓰게 됩니다. 이번엔 추상적인 설명보다 제 경험을 바탕으로 쓰겠습니다. 얼마전 유명 대회 출품 목적으로 영상처리를 하게 되었습니다. 이 과정에서는 당연히 전프레임과 현재 프레임을 비교 해야 했습니다.이를 위해 저는 현 프레임을 전프레임 변수에 할당해야 했죠. 문제는 간단히 해결 할 수 있죠. 첫번째 입니다.
	memcpy(prevImage, currentImage, imageScale);
    memcpy(prevImage, currentImage, imageScale);
간단한 솔루션이죠..^^..c에서 제공하는 기본 함수 이니 속도도 보장 됩니다.(기본 함수는 최적화가 되어 있는 상태로 릴리즈 됩니다.)
두번째 입니다.
	double * temp;
	temp	= currentImage;
	prevImage	= currentImage;
	currentImage	= temp;
이번엔 스왑 기술입니다. 실제 메모리에 할당된건 두 이미지(currentImage, prevImage)입니다. 이 구문을 통해 두 변수는 서로 자신의 값을 변경합니다. 다음 프레임을 처리할때에는 currentImage가 재할당 되지만 이는 전 프레임이 아닌 전전 프레임의 내용이니 상관없고 prev는 전프레임의 내용을 담고 있으니 조건 충족이죠.
 
  위 둘은 결국 같은 일을 합니다. 결과는 물론 여러가지로 다르지만 이건 프로그래머가 일부로 한것이니 문제 없겠죠. 그럼 이둘이 프로그램에 주는 효과는 무엇일까요?

 능숙한 프로그래머(속도 쪽으로)라면 눈치 채셨죠. 첫번째 알고리즘에 러시안 페인트공이 있습니다. 첫번째 알고리즘은 imageScale만큼의 메모리를 복사 하죠. 헌데 이는 이미지의 크기에 따라 변화합니다. 이 수치는 극히 짧을 수도 있고 수만,수백만의 크기일수도 있습니다.
 이에 반해 두번째는 그냥 3번 주소 재할당이 있었고 이는 imageScale의 크기에 상관없죠.

  이게 두번째 이슈 입니다. 프로그래머는 불확정 시간동안 프로그램이 구동하게 해서는 안됩니다. 이런걸 허용하면 처리해야할 데이터의 크기가 커졌을때 그 크기의 증가량 만큼만 쓰면 될 실행시간이 크기의 제곱 세제곱의 시간으로 늘어 나게 됩니다. 이게 러시안 페인트공의 무서운 점이죠. 사태가 이때 까지 가면 우린 무엇이 문제를 야기하는지도 찾기 힘들어 지죠..^^

여기서 제 이슈는 두가지였습니다.
1. 프로그래머는 프로그램이 빠른 시간안에 구동 되도록 보장해야 한다.
2. 프로그래머가 보장 못하는 정도의 시간을 쓰게 해서는 안된다.
추가로 하나 입니다.
 + 우리가 배운 수많은 프로그래밍 기법들은 조금만 변경해도 얼마든지 고급 프로그래밍 기술이 될 수 있다.
둘다 속도에 관한 이슈였죠..^^ 허접하지만 봐주셔서 감사합니다...^^
Posted by sbin

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

티스토리 툴바