코드 프로파일링
프로파일링은 프로그램의 성능을 분석하고, 성능 병목 지점을 식별하는 과정입니다. 이를 통해 최적화가 필요한 부분을 정확히 파악할 수 있습니다.
프로파일링 도구
- gprof: GNU 프로파일러로, C/C++ 프로그램의 성능을 분석하는 도구입니다.
- Valgrind: 메모리 디버깅과 프로파일링을 위한 도구입니다.
- perf: 리눅스 성능 분석 도구로, 다양한 하드웨어 성능 카운터를 제공합니다.
gprof 사용법
다음은 gprof
를 사용하여 C++ 프로그램을 프로파일링하는 예제입니다.
1. 코드 컴파일
프로파일링 정보를 포함하여 코드를 컴파일합니다.
g++ -pg main.cpp -o main
2. 프로그램 실행
프로파일링 데이터를 생성하기 위해 프로그램을 실행합니다.
./main
3. 프로파일링 결과 분석
gprof
를 사용하여 프로파일링 결과를 분석합니다.
gprof main gmon.out > analysis.txt
analysis.txt
파일을 열어 결과를 확인합니다.
벤치마킹
벤치마킹은 프로그램이나 특정 코드 조각의 성능을 측정하고 비교하는 과정입니다. 이를 통해 코드의 효율성을 평가할 수 있습니다.
벤치마킹 방법
- 고해상도 타이머 사용: C++에서 고해상도 타이머를 사용하여 코드 실행 시간을 측정합니다.
- 충분한 반복: 정확한 측정을 위해 코드를 여러 번 반복 실행합니다.
예제 코드
다음은 간단한 벤치마킹 예제입니다.
#include <iostream>
#include <vector>
#include <chrono>
void some_computation(std::vector<int>& data) {
for (auto& val : data) {
val = val * val;
}
}
int main() {
const int size = 1000000;
std::vector<int> data(size, 1);
auto start = std::chrono::high_resolution_clock::now();
some_computation(data);
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = end - start;
std::cout << "Elapsed time: " << elapsed.count() << " seconds" << std::endl;
return 0;
}
이 코드는 some_computation
함수의 실행 시간을 측정합니다.
실습 문제
문제 1: 프로파일링 및 벤치마킹 적용
다음 코드에서 프로파일링을 수행하고, some_computation
함수를 벤치마킹하여 성능을 분석해보세요.
main.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <chrono>
void some_computation(std::vector<int>& data) {
for (auto& val : data) {
val = val * val;
}
}
int main() {
const int size = 1000000;
std::vector<int> data(size, 1);
auto start = std::chrono::high_resolution_clock::now();
some_computation(data);
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = end - start;
std::cout << "Elapsed time: " << elapsed.count() << " seconds" << std::endl;
return 0;
}
해답:
1. 프로파일링 수행
프로파일링을 위한 컴파일 및 실행:
g++ -pg main.cpp -o main
./main
gprof main gmon.out > analysis.txt
analysis.txt
파일을 열어 some_computation
함수의 성능을 분석합니다.
2. 벤치마킹 수행
코드의 실행 시간을 측정하고 결과를 기록합니다.
#include <iostream>
#include <vector>
#include <chrono>
void some_computation(std::vector<int>& data) {
for (auto& val : data) {
val = val * val;
}
}
int main() {
const int size = 1000000;
std::vector<int> data(size, 1);
auto start = std::chrono::high_resolution_clock::now();
some_computation(data);
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = end - start;
std::cout << "Elapsed time: " << elapsed.count() << " seconds" << std::endl;
return 0;
}
실행:
g++ main.cpp -o main
./main
이제 세 번째 날의 학습을 마쳤습니다. 코드 프로파일링과 벤치마킹의 중요성을 이해하고, 다양한 도구를 사용하여 성능을 분석하는 방법을 학습하였습니다.
질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "캐시 최적화 기법"에 대해 학습하겠습니다.
'-----ETC----- > C++ 성능 최적화 및 고급 테크닉 시리즈' 카테고리의 다른 글
[C++ 성능 최적화 및 고급 테크닉] Day 5: 메모리 관리 최적화 (0) | 2024.08.01 |
---|---|
[C++ 성능 최적화 및 고급 테크닉] Day 6: 불필요한 복사 방지 (copy elision) (0) | 2024.08.01 |
[C++ 성능 최적화 및 고급 테크닉] Day 4: 캐시 최적화 기법 (0) | 2024.08.01 |
[C++ 성능 최적화 및 고급 테크닉] Day 2: 컴파일러 최적화 옵션 이해하기 (0) | 2024.08.01 |
[C++ 성능 최적화 및 고급 테크닉] Day 1: 성능 최적화의 중요성 및 기본 원칙 (0) | 2024.08.01 |