Update the profiler to allow for different level of profiling

This commit is contained in:
Abdelrahman Said 2023-07-23 16:36:21 +01:00
parent 0e973feb38
commit 19c02b4e99
4 changed files with 56 additions and 46 deletions

View File

@ -12,8 +12,12 @@ while [[ $# > 0 ]];do
RELEASE=true
shift
;;
--enable-profiling)
ENABLE_PROFILING=true
--basic-profiling)
BASIC_PROFILING=true
shift
;;
--full-profiling)
FULL_PROFILING=true
shift
;;
*|-*|--*)
@ -46,11 +50,11 @@ echo
# PROFILER
PROFSRC="../src/profiler/timer.c"
PROFFLAGS="-c"
PROFFLAGS="-c "
PROF_BUILD_DIR=prof_build
# PROCESSOR
JSONSRC="../src/json/*.c"
JSONSRC="../src/json/*.c "
JSONFLAGS="-c "
JSON_BUILD_DIR=json_build
@ -61,10 +65,18 @@ PROCSRC="./$JSON_BUILD_DIR/*.o \
./src/processor/main.cpp "
PROCOUT=prochavr
if [[ $ENABLE_PROFILING == true ]]; then
JSONFLAGS+="-DENABLE_PROFILING"
PROCSRC+="./$PROF_BUILD_DIR/*.o"
PROCFLAGS="-DENABLE_PROFILING"
if [[ $BASIC_PROFILING == true ]] || [[ $FULL_PROFILING == true ]]; then
if [[ $FULL_PROFILING == true ]]; then
JSONFLAGS+="-DFULL_PROFILING"
PROCFLAGS="-DFULL_PROFILING"
PROFFLAGS+="-DFULL_PROFILING"
elif [[ $BASIC_PROFILING == true ]]; then
JSONFLAGS+="-DBASIC_PROFILING"
PROCFLAGS="-DBASIC_PROFILING"
PROFFLAGS+="-DBASIC_PROFILING"
fi
PROCSRC+=./$PROF_BUILD_DIR/*.o
mkdir $PROF_BUILD_DIR
cd $PROF_BUILD_DIR

View File

@ -1,23 +0,0 @@
#ifndef PROFILER_IDS_H
#define PROFILER_IDS_H
enum profiler_ids {
PROFILER_ID_CLI_PARSE,
PROFILER_ID_JSON_PARSE,
PROFILER_ID_READ_JSON_FILE,
PROFILER_ID_PARSER_SETUP,
PROFILER_ID_LEX_GET_TOKEN,
PROFILER_ID_PARSE_TOKEN,
PROFILER_ID_PARSER_TEAR_DOWN,
PROFILER_ID_LOAD_JSON_PAIRS,
PROFILER_ID_READ_BINARY,
PROFILER_ID_HAVERSINE_SUM,
PROFILER_ID_HAVERSINE_DISTANCE,
PROFILER_ID_HAVERSINE_AVG,
PROFILER_ID_TEAR_DOWN,
PROFILER_ID_FREE_JSON,
COUNT_PROFILER_IDS,
};
#endif // !PROFILER_IDS_H

View File

@ -7,17 +7,29 @@
#define MAX_PROFILE_SAMPLES 1024
#endif // !MAX_PROFILE_SAMPLES
#ifdef ENABLE_PROFILING
#define PROFILE_START(COUNT) profile_start(COUNT)
#define PROFILE_END profile_end()
#ifdef FULL_PROFILING
#define SAMPLE_START(ID, TITLE) sample_start(ID, TITLE)
#define SAMPLE_END(ID) sample_end(ID)
#ifdef __cplusplus
extern "C" {
#endif
void sample_start(u64 id, const char *title);
void sample_end(u64 id);
#ifdef __cplusplus
}
#endif
#else
#define PROFILE_START(COUNT)
#define PROFILE_END
#define SAMPLE_START(ID, TITLE)
#define SAMPLE_END(ID)
#endif // ENABLE_PROFILING
#endif // FULL_PROFILING
#if defined(BASIC_PROFILING) || defined(FULL_PROFILING)
#define PROFILE_START(COUNT) profile_start(COUNT)
#define PROFILE_END profile_end()
#ifdef __cplusplus
extern "C" {
@ -49,11 +61,13 @@ u64 get_cpu_freq(u64 milliseconds);
void profile_start(u64 count);
void profile_end();
void sample_start(u64 id, const char *title);
void sample_end(u64 id);
#ifdef __cplusplus
}
#endif
#else
#define PROFILE_START(COUNT)
#define PROFILE_END
#endif // BASIC_PROFILING || FULL_PROFILING
#endif // !TIMER_H

View File

@ -7,6 +7,7 @@
#include <x86intrin.h>
#if defined(BASIC_PROFILING) || defined(FULL_PROFILING)
typedef struct {
profiler_sample_t samples[MAX_PROFILE_SAMPLES];
u64 cpu_freq;
@ -82,10 +83,6 @@ void profile_end() {
u16 time_precision = 16;
u16 time_char_count = 20;
u16 duration_char_count = 22;
u16 hits_char_count = 10;
u16 percentage_precision = 8;
u16 percentage_char_count = 12;
// clang-format off
printf("\n==============================PROFILING==============================\n");
@ -97,6 +94,12 @@ void profile_end() {
(unsigned long long)profiler.cpu_freq);
}
#ifdef FULL_PROFILING
u16 duration_char_count = 22;
u16 hits_char_count = 10;
u16 percentage_precision = 8;
u16 percentage_char_count = 12;
profiler_sample_t *sample = NULL;
for (u64 i = 0; i < profiler.size; ++i) {
@ -121,8 +124,11 @@ void profile_end() {
printf(")\n");
}
#endif // FULL_PROFILING
}
#endif // BASIC_PROFILING || FULL_PROFILING
#ifdef FULL_PROFILING
void sample_start(u64 id, const char *title) {
if (id >= MAX_PROFILE_SAMPLES) {
return;
@ -188,15 +194,16 @@ void sample_end(u64 id) {
profiler_sample_t *parent = sample->parent;
if (parent) {
sample->parent->start = now;
// Add sample duration to all parents. This handles deep call stacks
while (parent) {
parent->children_time += duration;
parent = parent->parent;
}
sample->parent->start = now;
}
profiler.active = sample->parent;
}
#endif // FULL_PROFILING