본문 바로가기
-----ETC-----/C++ 성능 최적화 및 고급 테크닉 시리즈

[C++ 성능 최적화 및 고급 테크닉] Day 3: 코드 프로파일링 및 벤치마킹

by cogito21_cpp 2024. 8. 1.
반응형

코드 프로파일링

프로파일링은 프로그램의 성능을 분석하고, 성능 병목 지점을 식별하는 과정입니다. 이를 통해 최적화가 필요한 부분을 정확히 파악할 수 있습니다.

 

프로파일링 도구

  1. gprof: GNU 프로파일러로, C/C++ 프로그램의 성능을 분석하는 도구입니다.
  2. Valgrind: 메모리 디버깅과 프로파일링을 위한 도구입니다.
  3. perf: 리눅스 성능 분석 도구로, 다양한 하드웨어 성능 카운터를 제공합니다.

 

gprof 사용법

다음은 gprof를 사용하여 C++ 프로그램을 프로파일링하는 예제입니다.

 

1. 코드 컴파일

프로파일링 정보를 포함하여 코드를 컴파일합니다.

g++ -pg main.cpp -o main

 

2. 프로그램 실행

프로파일링 데이터를 생성하기 위해 프로그램을 실행합니다.

./main

 

3. 프로파일링 결과 분석

gprof를 사용하여 프로파일링 결과를 분석합니다.

gprof main gmon.out > analysis.txt

analysis.txt 파일을 열어 결과를 확인합니다.

 

벤치마킹

벤치마킹은 프로그램이나 특정 코드 조각의 성능을 측정하고 비교하는 과정입니다. 이를 통해 코드의 효율성을 평가할 수 있습니다.

 

벤치마킹 방법

  1. 고해상도 타이머 사용: C++에서 고해상도 타이머를 사용하여 코드 실행 시간을 측정합니다.
  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;
}

 

이 코드는 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

 

이제 세 번째 날의 학습을 마쳤습니다. 코드 프로파일링과 벤치마킹의 중요성을 이해하고, 다양한 도구를 사용하여 성능을 분석하는 방법을 학습하였습니다.

질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "캐시 최적화 기법"에 대해 학습하겠습니다.

반응형