
__asm__ volatile를 사용하여 컴파일러가 최적화하지 못하도록 한다. load cycle 만큼 시간을 지연시키는 task를 의미한다. void dummy_task(long load) {
long i;
for (i = 0 ; i < load; i++)
__asm__ volatile ("nop");
}
__asm__ volatile ("nop"); volatile은 메모리 직접 접근을 의미한다.nop은 no operation으로 아무것도 하지 않는 것을 의미한다.lscpu 명령어를 사용하여 현재 cpu의 frequcy를 확인한다.
benchmark.cpp 파일을 만들고, 아래 코드를 붙여넣는다.#include <chrono>
#include <iostream>
#include <string>
void dummy_task(long load) {
for (long i = 0; i < load; i++) {
__asm__ volatile ("nop");
__asm__ volatile ("nop");
__asm__ volatile ("nop");
__asm__ volatile ("nop");
__asm__ volatile ("nop");
__asm__ volatile ("nop");
__asm__ volatile ("nop");
__asm__ volatile ("nop");
__asm__ volatile ("nop");
__asm__ volatile ("nop");
}
}
double measure_execution_time(long load) {
auto start = std::chrono::high_resolution_clock::now();
dummy_task(load);
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::milli> execution_time = end - start;
return execution_time.count();
}
double measure_average_execution_time(long load, int num_measurements = 10) {
double total_time = 0.0;
for (int i = 0; i < num_measurements; i++) {
total_time += measure_execution_time(load);
}
return total_time / num_measurements;
}
long calculate_load_for_target_time(double target_time, double initial_time, long initial_load) {
double ratio = target_time / initial_time;
return static_cast<long>(initial_load * ratio);
}
int main(int argc, char* argv[]) {
if (argc < 2) {
std::cerr << "Usage: " << argv[0] << " <target_time_ms>" << std::endl;
return 1;
}
double target_time = std::stod(argv[1]);
long initial_load = 100;
double average_initial_time = measure_average_execution_time(initial_load);
long estimated_load = calculate_load_for_target_time(target_time, average_initial_time, initial_load);
std::cout << "Measured execution time for initial load " << initial_load << ": " << average_initial_time << " ms" << std::endl;
std::cout << "For a target time of " << target_time << " ms, the estimated load is: " << estimated_load << std::endl;
return 0;
}
g++ -o benchmark_test benchmark_test.cpp
./benchmark_test <원하는 시간>