C++ STL에서 함수 실행 시간 측정

Jinku Hu 2023년10월12일
  1. std::chrono::high_resolution_clock::nowstd::chrono::duration_cast<std::chrono::seconds>를 사용하여 함수의 실행 시간 측정
  2. std::chrono::high_resolution_clock::nowstd::chrono::duration<double, std::milli>를 사용하여 함수의 실행 시간 측정
C++ STL에서 함수 실행 시간 측정

이 기사에서는 C++에서 함수의 실행 시간을 측정하는 방법에 대한 여러 방법을 보여줍니다.

std::chrono::high_resolution_clock::nowstd::chrono::duration_cast<std::chrono::seconds>를 사용하여 함수의 실행 시간 측정

std::chrono 네임 스페이스는 C++ STL 라이브러리에서 제공하는 모든 날짜 및 시간 유틸리티를 통합합니다. 후자는 다중 클록 구현을 제공하며, 그중 하나는 틱주기가 가장 작은 클록에 해당하는std::chrono::high_resolution_clock입니다. 그러나이 클럭은 하드웨어 플랫폼에 따라 다르며 여러 표준 라이브러리 구현도 다르므로 컴파일러 문서를 읽고 이것이 문제 요구 사항에 적합한 지 확인하는 것이 가장 좋습니다. 함수의 실행 시간을 측정하는 아이디어는 주어진 시계에서 현재 시간을 두 번 (함수 호출 전과 후) 검색하고 값 간의 차이를 계산하는 것입니다. 현재 시간은now 내장 메소드를 사용하여 검색됩니다. 차이가 계산되면 특정 시간 단위로 해석되어야하며std::chrono::duration_cast 유틸리티를 사용하여 수행됩니다. 다음 예에서는 결과를std::chrono::seconds 단위로 캐스트하고count 내장 함수로 값을 출력합니다. 코드 예제에서funcSleep은 프로그램 실행을 3 초 동안 중단 한 다음main 함수로 제어를 반환합니다.

#include <chrono>
#include <iostream>
#include <thread>

using std::cout;
using std::endl;

void funcSleep() { std::this_thread::sleep_for(std::chrono::seconds(3)); }

int main() {
  auto start = std::chrono::high_resolution_clock::now();
  funcSleep();
  auto end = std::chrono::high_resolution_clock::now();

  auto int_s = std::chrono::duration_cast<std::chrono::seconds>(end - start);

  std::cout << "funcSleep() elapsed time is " << int_s.count() << " seconds )"
            << std::endl;

  return EXIT_SUCCESS;
}

출력:

funcSleep() elapsed time is 3 seconds

std::chrono::high_resolution_clock::nowstd::chrono::duration<double, std::milli>를 사용하여 함수의 실행 시간 측정

시간 단위가 정수 값으로 저장되었던 이전 코드와 대조적으로, 다음 예에서는 간격 값을 std::chrono::duration<double, std::milli> 형식 객체에 부동 소수점 숫자로 저장합니다. std::chrono::duration은 시간 간격을 나타내는 일반 클래스 템플릿입니다. 마지막으로, 간격 값은count함수를 사용하여 검색되며,이 지점에서cout스트림에 인쇄 할 수 있습니다.

#include <chrono>
#include <iostream>
#include <thread>

using std::cout;
using std::endl;

void funcSleep() { std::this_thread::sleep_for(std::chrono::seconds(3)); }

int main() {
  auto start = std::chrono::high_resolution_clock::now();
  funcSleep();
  auto end = std::chrono::high_resolution_clock::now();

  std::chrono::duration<double, std::milli> float_ms = end - start;

  std::cout << "funcSleep() elapsed time is " << float_ms.count()
            << " milliseconds" << std::endl;

  return EXIT_SUCCESS;
}

출력:

funcSleep() elapsed time is 3000.27 milliseconds

지난 두 가지 예에서는 대부분 일정한 시간이 걸리는 함수를 측정했지만 비슷한 접근 방식을 사용하여 주어진 코드 블록의 실행 시간을 계산할 수 있습니다. 예를 들어, 다음 스 니펫은 실행하는 데 더 많은 가변 간격을 사용하는 임의 정수 생성 함수를 보여줍니다. 이번에는 두 가지 방법을 모두 사용하여 시간을 밀리 초 정밀도와 초로 표시했습니다.

#include <chrono>
#include <iostream>
#include <thread>

using std::cout;
using std::endl;

constexpr int WIDTH = 1000000;

void generateNumbers(int arr[]) {
  std::srand(std::time(nullptr));
  for (size_t i = 0; i < WIDTH; i++) {
    arr[i] = std::rand();
  }
}

int main() {
  int *arr = new int[WIDTH];

  auto start = std::chrono::high_resolution_clock::now();
  generateNumbers(arr);
  auto end = std::chrono::high_resolution_clock::now();

  std::chrono::duration<double, std::milli> float_ms = end - start;
  auto int_ms =
      std::chrono::duration_cast<std::chrono::milliseconds>(end - start);

  std::chrono::duration<long, std::micro> int_usec = int_ms;

  std::cout << "generateNumbers() elapsed time is " << float_ms.count()
            << " ms "
            << "( " << int_ms.count() << " milliseconds )" << std::endl;

  delete[] arr;
  return EXIT_SUCCESS;
}

출력:

generateNumbers() elapsed time is 30.7443 ms ( 30 milliseconds )
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C++ Time