반응형
실전 최적화 사례 연구
오늘은 실전에서 성능을 최적화한 사례를 더 깊이 연구하겠습니다. 특히, 데이터 구조의 선택과 알고리즘의 효율성을 고려한 최적화 기법을 살펴보겠습니다.
사례 1: 데이터 구조 최적화
적절한 데이터 구조를 선택하면 성능을 크게 향상시킬 수 있습니다. 예를 들어, 해시맵을 사용하여 탐색 시간을 줄일 수 있습니다.
예제 코드: 데이터 구조 최적화 전
#include <iostream>
#include <vector>
bool contains(const std::vector<int>& vec, int value) {
for (int i : vec) {
if (i == value) {
return true;
}
}
return false;
}
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
std::cout << "Contains 3: " << contains(vec, 3) << std::endl;
std::cout << "Contains 6: " << contains(vec, 6) << std::endl;
return 0;
}
예제 코드: 데이터 구조 최적화 후
#include <iostream>
#include <unordered_set>
bool contains(const std::unordered_set<int>& set, int value) {
return set.find(value) != set.end();
}
int main() {
std::unordered_set<int> set = {1, 2, 3, 4, 5};
std::cout << "Contains 3: " << contains(set, 3) << std::endl;
std::cout << "Contains 6: " << contains(set, 6) << std::endl;
return 0;
}
사례 2: 알고리즘 최적화
효율적인 알고리즘을 사용하면 성능을 크게 개선할 수 있습니다. 예를 들어, 정렬 알고리즘을 선택할 때 퀵소트(QuickSort)를 사용하는 것이 버블소트(BubbleSort)보다 훨씬 효율적입니다.
예제 코드: 알고리즘 최적화 전
#include <iostream>
#include <vector>
void bubbleSort(std::vector<int>& vec) {
int n = vec.size();
for (int i = 0; i < n - 1; ++i) {
for (int j = 0; j < n - i - 1; ++j) {
if (vec[j] > vec[j + 1]) {
std::swap(vec[j], vec[j + 1]);
}
}
}
}
int main() {
std::vector<int> vec = {5, 2, 9, 1, 5, 6};
bubbleSort(vec);
for (int n : vec) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
예제 코드: 알고리즘 최적화 후
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> vec = {5, 2, 9, 1, 5, 6};
std::sort(vec.begin(), vec.end()); // 퀵소트 기반 정렬
for (int n : vec) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
사례 3: 함수 호출 최적화
함수 호출을 줄이거나 인라인 함수를 사용하면 성능을 개선할 수 있습니다.
예제 코드: 함수 호출 최적화 전
#include <iostream>
#include <vector>
int multiply(int a, int b) {
return a * b;
}
void multiplyVector(std::vector<int>& vec, int factor) {
for (int& n : vec) {
n = multiply(n, factor);
}
}
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
multiplyVector(vec, 2);
for (int n : vec) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
예제 코드: 함수 호출 최적화 후
#include <iostream>
#include <vector>
inline int multiply(int a, int b) {
return a * b;
}
void multiplyVector(std::vector<int>& vec, int factor) {
for (int& n : vec) {
n = multiply(n, factor);
}
}
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
multiplyVector(vec, 2);
for (int n : vec) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
실습 문제
문제 1: 데이터 구조와 알고리즘 최적화
다음 코드에서 효율적인 데이터 구조와 알고리즘을 사용하여 성능을 최적화하세요.
main.cpp
#include <iostream>
#include <vector>
void findAndPrint(const std::vector<int>& vec, int value) {
for (int i : vec) {
if (i == value) {
std::cout << "Found: " << value << std::endl;
return;
}
}
std::cout << "Not found: " << value << std::endl;
}
int main() {
std::vector<int> vec = {5, 2, 9, 1, 5, 6};
findAndPrint(vec, 9);
findAndPrint(vec, 7);
std::sort(vec.begin(), vec.end());
for (int n : vec) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
해답:
main.cpp (최적화 적용)
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_set>
void findAndPrint(const std::unordered_set<int>& set, int value) {
if (set.find(value) != set.end()) {
std::cout << "Found: " << value << std::endl;
} else {
std::cout << "Not found: " << value << std::endl;
}
}
int main() {
std::vector<int> vec = {5, 2, 9, 1, 5, 6};
std::unordered_set<int> set(vec.begin(), vec.end());
findAndPrint(set, 9);
findAndPrint(set, 7);
std::sort(vec.begin(), vec.end());
for (int n : vec) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
이제 스물세 번째 날의 학습을 마쳤습니다. 실전 최적화 사례를 통해 데이터 구조 최적화, 알고리즘 최적화, 함수 호출 최적화 등의 기법을 적용하는 방법을 학습했습니다.
질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "프로젝트: 고성능 매트릭스 라이브러리 개발 (1)"에 대해 학습하겠습니다.
반응형
'-----ETC----- > C++ 성능 최적화 및 고급 테크닉 시리즈' 카테고리의 다른 글
[C++ 성능 최적화 및 고급 테크닉] Day 25: 프로젝트: 고성능 매트릭스 라이브러리 개발 (2) (0) | 2024.08.01 |
---|---|
[C++ 성능 최적화 및 고급 테크닉] Day 22: 실전 최적화 사례 연구 (1) (0) | 2024.08.01 |
[C++ 성능 최적화 및 고급 테크닉] Day 20: OpenMP를 이용한 병렬 프로그래밍 (0) | 2024.08.01 |
[C++ 성능 최적화 및 고급 테크닉] Day 21: CUDA를 이용한 GPU 프로그래밍 (0) | 2024.08.01 |
[C++ 성능 최적화 및 고급 테크닉] Day 18: 고급 멀티스레딩 기법 (락 프리 프로그래밍) (0) | 2024.08.01 |