본문 바로가기

Tech Insight/소프트웨어 엔지니어링 SE

섣부르지 않은 소프트웨어 최적화 기법

컴퓨터공학 관점에서 소프트웨어의 최적화는 필수이면서도, 그것이 잘 되지 않으면 마치 문제 있는 소프트웨어처럼 여겨지는 경우가 있습니다. 하지만 섣부른 최적화는 오히려 안 하는 것만 못한 일이 될 수도 있는데요. 그렇다면 최적화를 어떻게 해야하는 것이 올바를지 좋은 사례가 있어서 정리했습니다. 바로 최적화를 위한 5가지 기법인데요, 자세한 코드 예시들이 있으니 본문을 꼼꼼히 살펴서 공부해 보시면 좋을 것 같습니다.

 

📌 최적화를 위한 5가지 기법

 

1. 동적 배열의 용량(capacity)은 미리 선언한다.

  • 동적 배열의 용량을 늘리는 연산에는 많은 비용이 들어간다. 동적 배열 선언 시, 미리 용량을 선언하는 것만으로 4배 이상의 성능 개선 효과를 얻을 수 있다.

 

2. 반복문 안에서 파일 출력은 최대한 피한다.

  • 파일을 출력을 위해 운영체제로 보내는 시스템 콜(System Call)은 연산하는데 많은 비용을 필요로 한다. 반복문 안에서 파일을 출력하면 반복문의 횟수만큼 시스템 콜을 해야 하고, 이는 많은 비효율을 초래한다.

 

3. 문자열이 불변(immutable)하는 객체일 경우 덧셈을 반복하지 않는다.

  • 대부분 문자열 객체는 생성 후 변경이 불가능하지만, 파이썬에서는 이를 허용한다. 그런데 연산이 동적 배열을 확장할 때와 같은 원리로 일어나기 때문에, 반복문에서 문자열의 덧셈(복사) 연산을 계속 수행하면 성능에 안 좋은 영향을 미칠 수 있다.

 

4. 멀티 스레딩(Multi-thread)을 '적절히' 활용한다.

  • 코드의 동시성이 무조건 처리 속도가 빨라지는 것을 의미하지 않는다. 쓰레드를 할당하고 관리하는 작업 역시 성능에 영향을 끼친다.
  • 멀티스레딩의 코드 복잡도를 증가시킬 수 있다. 공유하고 있는 자원이 많을 경우, 디버깅의 난이도는 급상승한다.

 

5. 생성에 오랜 시간 걸리는 객체가 있다면 미리 만들어둔다.

  • 객체를 미리 만들 경우, 싱글 스레드 버전은 약 17%, 멀티스레드 버전은 약 14% 속도를 감축시킬 수 있다.

 

 

섣부르지 않은 최적화 기법

'섣부른 최적화는 만악의 근원'이라는 말이 있습니다. 하지만 섣부르지 않다면 어떨까요? 코드의 복잡도를 크게 증가시키지 않으면서 성능을 높이는 방법을 소개합니다.

velog.io