프로그램 최적화
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
프로그램 최적화는 컴퓨터 프로그램의 효율성을 향상시키는 과정이다. 이는 계산 방식을 변경하거나, 불필요한 기능을 제거하여 실행 속도를 높이고 메모리 사용량을 줄이는 것을 포함한다. 최적화는 설계, 알고리즘, 소스 코드, 컴파일러, 하드웨어 등 다양한 수준에서 이루어질 수 있으며, 자동 또는 수동으로 수행될 수 있다. 최적화 과정에서는 실행 시간, 메모리 사용량, 코드 가독성 간의 상충 관계, 병목 현상, 알고리즘 선택, 메모리 활용, 최적화 시기 및 비용 등을 고려해야 한다.
더 읽어볼만한 페이지
- 컴퓨터 최적화 - 하드웨어 가속
하드웨어 가속은 성능 향상을 위해 특정 연산을 전용 하드웨어로 처리하는 기술이며, 병렬 처리를 통해 연산 속도를 높이지만 유연성이 감소하고 비용이 증가하는 특징을 갖는다. - 컴퓨터 최적화 - AI 가속기
AI 가속기는 딥 러닝 등 인공지능 연산 효율을 높이기 위해 특수 설계된 하드웨어 장치 또는 시스템으로, CPU, GPU, FPGA, ASIC 등 다양한 형태로 구현되어 데이터 센터, 자율 주행 자동차, 모바일 기기 등에 적용되며, MLPerf 등으로 성능이 평가된다. - 소프트웨어 최적화 - 성능 공학
성능 공학은 시스템의 비즈니스 수익 증대를 위해 정해진 시간 안에 트랜잭션을 처리하도록 보장하고, 시스템 개발 실패 및 유지보수 비용 증가를 방지하며, 성능 관리와 모니터링을 통해 서비스 수준 계약을 준수하도록 한다. - 소프트웨어 최적화 - 프로파일링 (컴퓨터 프로그래밍)
프로파일링(컴퓨터 프로그래밍)은 프로그램의 성능 분석 및 개선을 위한 기술로, 실행 시간 측정과 병목 현상 파악에 사용되며, 다양한 종류의 프로파일러가 존재한다. - 프로그래밍 언어 주제 - 프로그래밍 패러다임
프로그래밍 패러다임은 프로그래머에게 프로그램 작성 방식을 제시하는 관점 또는 스타일이며, 구조적 프로그래밍을 시작으로 절차적, 객체 지향, 선언형 등으로 발전해 명령형, 선언형, 멀티 패러다임 프로그래밍 언어로 분류된다. - 프로그래밍 언어 주제 - 구문 (프로그래밍 언어)
프로그래밍 언어의 구문은 프로그램을 구성하는 규칙의 집합으로, 어휘, 문법, 컨텍스트 세 단계로 나뉘어 단어, 구, 의미 요소의 형성을 정의하며, 정규 표현식과 문맥 자유 문법으로 표현될 수 있다.
프로그램 최적화 | |
---|---|
일반 정보 | |
분야 | 컴퓨터 과학 |
하위 분야 | 소프트웨어 공학 |
목표 | |
목표 | 컴퓨터 프로그램의 특정 측면을 개선하는 것 |
측면 | 실행 속도 메모리 사용량 디스크 공간 사용량 전력 소비 기타 자원 소비 |
기법 | |
주요 기법 | 알고리즘 선택 자료 구조 선택 프로그래밍 언어 선택 컴파일러 최적화 활용 병렬 처리 캐싱 코드 튜닝 |
고려 사항 | |
고려 사항 | 정확성 유지 코드 가독성 유지 유지보수성 유지 |
측정 방법 | |
측정 방법 | 성능 분석 프로파일링 벤치마킹 |
관련 주제 | |
관련 주제 | 컴파일러 최적화 자동 튜닝 성능 엔지니어링 소프트웨어 성능 테스팅 |
2. 기본
계산 작업은 여러 방식에 따라 효율성이 달라진다. 예를 들어, 1에서 N까지의 모든 정수를 합하는 다음의 C 코드를 보자.
최적화는 여러 수준에서 발생할 수 있으며, 일반적으로 상위 수준의 최적화가 더 큰 영향을 미치고 프로젝트 후반부에 변경하기 더 어렵다. 따라서 최적화는 상위 수준에서 하위 수준으로 세분화하는 방식으로 진행될 수 있다.
```cpp
int i, sum = 0;
for (i = 1; i <= N; i++)
sum += i;
printf ("합: %d\n", sum);
```
아래의 코드는 수학 공식을 사용하여 다시 구성한 것이다: (산술 오버플로우가 없다는 가정 아래)
```cpp
int sum = (N * (N+1)) / 2;
printf ("합: %d\n", sum);
```
그러므로, 자동으로 완료되는 최적화는 비록 둘 다 기능이 똑같이 수행되지만 계산하기에 더 효과적인 방식을 채택하는 것이다. 그러나 성능 상의 중대한 개선은 실제 문제만 해결하고 부가되는 기능을 제거함으로써 이룩할 수 있다.
최적화는 언제나 명백하거나 직관적인 과정인 것은 아니다. 위의 예시에서 '최적화된' 버전은 원래의 소프트웨어보다 실제로 더 느리게 동작할 수도 있다. 예를 들어 N이 작고 컴퓨터가 나누기, 곱셈보다 더하기, 루프 함수를 수행하는 쪽이 더 빠르다면 말이다.
3. 최적화 수준
4. 자동 최적화와 수동 최적화
자동 최적화는 컴파일러가 자동으로 수행하는 최적화이다. 컴파일러는 코드를 분석하여 더 효율적인 방식으로 코드를 재구성한다. 예를 들어, 반복문을 최적화하거나 불필요한 연산을 제거한다.
수동 최적화는 프로그래머가 직접 코드를 수정하여 성능을 개선하는 것이다. 프로그래머는 프로파일러를 사용하여 프로그램의 어느 부분이 가장 많은 시간을 소비하는지(병목 현상) 파악한다. 병목 현상을 찾은 후에는 다음과 같은 방법으로 최적화를 수행할 수 있다.
- 알고리즘 재고: 더 효율적인 알고리즘을 사용하거나, 특정 문제에 특화된 알고리즘을 적용한다. 예를 들어, 정렬 알고리즘을 퀵 정렬에서 다른 알고리즘으로 변경하거나, 특수한 상황에 맞는 정렬 루틴을 사용할 수 있다.
- 코드 최적화: 루프 전개를 수행하거나, 더 작은 데이터 타입을 사용하거나, 정수 연산을 활용하는 등 코드 자체를 최적화한다.
- 다른 프로그래밍 언어 사용: 프로그램의 일부분을 다른 프로그래밍 언어로 다시 작성하여 성능을 향상시킬 수 있다. 예를 들어, 파이썬에서 속도가 중요한 부분을 C 언어 모듈로 작성하거나, C 언어 프로그램에서 일부를 어셈블리 언어로 작성할 수 있다. D 언어는 인라인 어셈블러를 활용할 수 있다.
수동 최적화는 가독성을 해칠 수 있으므로, 코드 최적화는 신중하게 문서화하고, 향후 개발에 미치는 영향을 평가해야 한다.
자동 최적화를 수행하는 프로그램을 옵티마이저(optimizer)라고 부르며, 주로 컴파일러에 내장되어 컴파일 중에 최적화를 수행한다.
5. 최적화 시 고려 사항
최적화는 일반적으로 한 가지 측면을 개선하면 다른 측면이 희생되는 상충 관계를 수반한다.[3] 예를 들어, 캐시의 크기를 늘리면 실행 시간 성능은 향상되지만 메모리 소비도 증가한다.[3] 코드의 명확성과 간결성 또한 일반적인 상충 관계에 해당한다.[3]
프로그램 최적화에서는 시스템의 병목 현상을 찾는 것이 중요하다.[3] 병목 현상은 성능의 제한 요소가 되는 구성 요소이다.[3] 코드 측면에서 핫 스팟, 즉 필요한 자원을 주로 소비하는 코드의 중요한 부분이 병목 현상에 해당할 수 있다.[3]
도널드 커누스는 최적화에 대해 다음과 같은 두 가지 진술을 하였다.[5]
> "우리는 작은 효율성에 대해 잊어야 합니다. 즉, 시간의 약 97%는 조기 최적화가 모든 악의 근원입니다. 그러나 우리는 그 중요한 3%의 기회를 놓치지 않아야 합니다."[5]
> "확립된 엔지니어링 분야에서 쉽게 얻을 수 있는 12%의 개선은 결코 미미한 것으로 간주되지 않으며, 소프트웨어 엔지니어링에서도 동일한 관점이 우세해야 한다고 생각합니다."[5]
"조기 최적화"는 프로그래머가 성능 고려 사항 때문에 코드 설계를 변경하는 상황을 설명하는 데 사용되는 문구이다.[5]
프로그램의 특정 부분을 최적화할지 여부를 결정할 때는 암달의 법칙을 항상 고려해야 한다.[5] 더 나은 접근 방식은 먼저 설계를 하고, 설계에 따라 코드를 작성한 다음, 결과 코드를 프로파일링 (컴퓨터 프로그래밍)/벤치마킹 (컴퓨팅)하여 어떤 부분을 최적화해야 하는지 확인하는 것이다.[5]
최적화를 수행하는 데 걸리는 시간 자체가 문제가 될 수 있다.[8] 기존 코드를 최적화하는 것은 새로운 기능을 추가하지 않으며, 이전에 작동하던 코드에 새로운 소프트웨어 버그를 추가할 수도 있다.[8] 수동으로 최적화된 코드는 최적화되지 않은 코드보다 가독성이 떨어질 수 있으므로 최적화는 유지 관리에도 영향을 미칠 수 있다.[8]
6. 최적화와 관련된 격언
도널드 커누스는 최적화에 대해 "시간의 약 97%는 조기 최적화가 모든 악의 근원"이라며, "작은 효율성은 잊어야 한다"고 말했다.[5] 그러나 "나머지 3%의 기회는 놓치지 않아야 한다"고 덧붙였다.[5] 그는 또한 "확립된 엔지니어링 분야에서 쉽게 얻을 수 있는 12%의 개선은 결코 미미한 것으로 간주되지 않으며, 소프트웨어 엔지니어링에서도 동일한 관점이 우세해야 한다"고 말했다.[5] 커누스는 이 말을 앤서니 호어에게서 유래했다고 했지만, 호어는 부인하고 있다.[6][7]
"조기 최적화"란 프로그래머가 코드 설계 시 성능을 고려하여 코드가 복잡해지거나 부정확해지는 결과를 초래하는 상황을 말한다.
롭 파이크는 "병목 현상은 예상치 못한 장소에 존재하므로, 병목 현상의 위치를 특정하기 전까지 성능 최적화(해킹)를 해서는 안 된다"라고 말했다.
Michael A. Jackson은 "프로그램 최적화의 제1법칙: 최적화하지 마라. 프로그램 최적화의 제2법칙(상급자 한정): 아직 하지 마라."라는 말을 남겼다.
7. 한국의 특수 상황
빠르게 변화하는 IT영어 기술 발전 속도를 고려할 때, 한국에서는 최신 기술과 하드웨어에 대한 이해를 바탕으로 최적화를 수행해야 한다. 한국 사용자들은 높은 수준의 성능과 빠른 응답 속도를 기대하므로, 사용자 경험을 고려한 최적화가 중요하다. 모바일 기기 사용이 보편화된 한국에서는 모바일 환경에 최적화된 코드 작성이 필수적이다. 경쟁이 치열한 한국 소프트웨어 시장에서는 성능 최적화를 통해 경쟁 우위를 확보하는 것이 중요하다.
참조
[1]
서적
Algorithms
1984
[2]
논문
Inner loop program construct: A faster way for program execution
2018-08-01
[3]
서적
The Every Computer Performance Book, Chapter 3: Useful laws
CreateSpace
2013
[4]
웹사이트
Performance Profiling with a Focus
http://www.developfo[...]
2017-08-15
[5]
논문
Structured Programming with go to Statements
1974-12
[6]
간행물
The Errors of [[TeX]]
1989-07
[7]
웹사이트
Premature optimization is the root of all evil
https://hans.gerwitz[...]
2020-12-18
[8]
논문
Using meta-heuristics and machine learning for software optimization of parallel computing systems: a systematic literature review
Springer Vienna
2018-04-26
[9]
문서
該当部分は邦訳版『文芸的プログラミング』p. 52
[10]
웹사이트
The Fallacy of Premature Optimization
http://www.acm.org/u[...]
[11]
웹사이트
Structured Programming with Goto Statements
http://pplab.snu.ac.[...]
1974
[12]
서적
Algorithms
1984
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com