Post

코드를 최적화하는 방법

이 글에는 이해를 돕기 위한 거짓말이 조금 포함되어 있습니다.

21세기식 역지사지?

개발을 시작하기 전에 글에서 코드 최적화를 진행하는 가장 쉬운 방법으로 컴퓨터가 하는 일을 사람이 한다고 생각하면 된다고 설명했는데 이에 대한 간단한 예시를 보여드리고자 합니다.

갑자기 분위기 K-메타버스

blender
설명은 역시 눈에 보이는 데이터가 있는 편이 이해에 편하겠죠? 이번엔 간단한 모델 필터를 이용해 설명드리려고 합니다. Blender 사용법에 대해서는 다루지 않고, 설명을 위한 부분만 추가 설명이 있을 예정입니다.

우리가 작업하려는 것

box
시작할 때 기본으로 생성되어있는 이 박스는, 8개의 정점(3D에서는 Vertices 라고 함)으로 이루어져있습니다.

우리는 이 도형에 필터를 적용할 예정입니다.

subdivision
Subdivision 필터는 면을 분할하여 원래 모델이 보다 완만한 표면 각도가 되도록 구성합니다. 그 과정 중 원래 모델에 정점을 더 많이 추가하게 됩니다. 본래 기능은 이보다 복잡하지만 이정도로 설명할께요.

mirror
그리고나서, 필터 처리된 개체를 복제해볼께요. 당연하지만, 이렇게 되면 총 점 갯수는 2배가 됩니다.

작업 순서 정하기

changeable
우리가 하려는 것은 기본 도형에 면 분할을 넣고 개체 복제하는 행동 입니다. 이 결과물을 완성하는 것은 매우 쉬운데, 우리가 선택해야하는 부분이 있습니다.

  1. 정육면체에 면 분할 효과를 적용한 후, 개체를 복제하기
    또는
  2. 정육면체를 먼저 복제한 후, 두 개체에 분할 효과를 적용하기

이 경우, 작업 순서가 바뀌더라도 결과물은 똑같이 나옵니다.

결과물이 똑같다면 그냥 아무렇게나 해도 상관없지 않나요?

그렇게 생각할 수도 있지만 위 두 과정은 결과물이 같음에도 불구하고, 컴퓨터가 받는 부하량이 다릅니다.

사람이 직접 한다고 대입해보기

컴퓨터가 연산을 한다는 것은 사람이 수학 문제를 푸는 것과 같습니다. 컴퓨터가 자료 복제 행동을 하는 것은 사람이 손수 책을 따라쓰는 것과 같죠. 이렇게 생각하면 두가지 작업 순서에는 각각 장단점이 생기게 됩니다.

면 분할 후 복사하기의 경우:

장점: 면 분할 계산을 1번만 해도 된다.
단점: 복사할 내용이 많아진다. (면 분할 후 점 갯수가 늘어나므로)

복사한 후 면 분할하기의 경우:

장점: 복사할 내용이 적다.
단점: 면 분할 계산을 2번 해야한다. (컴퓨터 특성상 같은 연산이라도 처음부터 다시 계산하겠죠?)

그리고 각 행동에 특징이 있습니다.

면 분할 계산: 세상에 존재하지 않는 결과값을 계산을 통해 얻어내는 것이므로, 머리가 뜨거워집니다(부하 많음).
복제: 이미 준비된 내용을 따라 적는 것으로, 팔이 좀 아프겠지만 머리가 뜨거워질 정도는 아닙니다(부하 적음).

컴퓨터의 자원 분배 상태에 따라 다르겠지만, 대체로 연산을 먼저 한 후 복사하는 것이 같은 결과물을 낼 때 효율적일 것이라는 것을 알 수 있습니다.

이런 식으로, 결과물이 같더라도 더 효율적인 과정을 만들어내는 것이 사람들이 이야기하는 최적화입니다.

실제 코딩에서는…

멀티쓰레드 코딩이 등장하기 전까지, 모든 코드에는 순서가 있다고 했었죠?

1
2
3
if (isObjectAvailable && isButtonPressed) { 
    // ...
}

개체의 사용 가능 여부와 버튼이 눌렸는지 여부를 동시에 비교해야할 때 어떤 검토가 우선적으로 이루어지는게 검토량을 줄일 수 있을까요?

1
2
3
4
5
6
function CalculatePosition() {
    CheckIfUserInput();
    CalculateVelocity();
    CalculateAcceleometer();
    // ...
}

사용자와 상호작용하는 개체 위치를 계산할 때 무엇이 먼저 계산되는 편이 연산을 조금 할까요?

이제 우리가 컴퓨터를 심도있게 알지 못하더라도, 코드를 따라가면서 검토할 수 있습니다. 사람이 한다면 이런 순서가 쉬울까?라는 간단한 대입을 통해서 말이죠 😄

This post is licensed under CC BY 4.0 by the author.