Log performance counters at the end.

This commit is contained in:
Themaister 2012-10-30 23:28:54 +01:00
parent a1f40f6009
commit fbfbf1ed6a
6 changed files with 53 additions and 18 deletions

View File

@ -26,6 +26,26 @@
#include <sys/time.h> #include <sys/time.h>
#endif #endif
#define MAX_COUNTERS 64
static struct rarch_perf_counter *perf_counters[MAX_COUNTERS];
static unsigned perf_ptr;
void rarch_perf_register(struct rarch_perf_counter *perf)
{
if (perf_ptr >= MAX_COUNTERS)
return;
perf_counters[perf_ptr++] = perf;
perf->registered = true;
}
void rarch_perf_log(void)
{
RARCH_LOG("[PERF]: Performance counters:\n");
for (unsigned i = 0; i < perf_ptr; i++)
RARCH_PERFORMANCE_LOG(perf_counters[i]->ident, *perf_counters[i]);
}
rarch_perf_tick_t rarch_get_perf_counter(void) rarch_perf_tick_t rarch_get_perf_counter(void)
{ {
rarch_perf_tick_t time = 0; rarch_perf_tick_t time = 0;

View File

@ -28,23 +28,45 @@ typedef unsigned long long rarch_perf_tick_t;
typedef struct rarch_perf_counter typedef struct rarch_perf_counter
{ {
const char *ident;
rarch_perf_tick_t start; rarch_perf_tick_t start;
rarch_perf_tick_t total; rarch_perf_tick_t total;
unsigned call_cnt; uint64_t call_cnt;
bool registered;
} rarch_perf_counter_t; } rarch_perf_counter_t;
rarch_perf_tick_t rarch_get_perf_counter(void); rarch_perf_tick_t rarch_get_perf_counter(void);
void rarch_perf_register(struct rarch_perf_counter *perf);
void rarch_perf_log(void);
#ifdef PERF_TEST #ifdef PERF_TEST
#define RARCH_PERFORMANCE_INIT(X) static rarch_perf_counter_t X #define RARCH_PERFORMANCE_INIT(X) static rarch_perf_counter_t X = {#X}; \
#define RARCH_PERFORMANCE_START(X) ((X).start = rarch_get_perf_counter()) do { \
#define RARCH_PERFORMANCE_STOP(X) do { (X).total += rarch_get_perf_counter() - (X).start; (X).call_cnt++; } while(0) /* TODO: we should increment at PERFORMANCE_START instead of PERFORMANCE_STOP since sometimes we cannot assume that we don't prematurely exit out of the function */ if (!(X).registered) \
rarch_perf_register(&(X)); \
} while(0)
#define RARCH_PERFORMANCE_START(X) do { \
(X).call_cnt++; \
(X).start = rarch_get_perf_counter(); \
} while(0)
#define RARCH_PERFORMANCE_STOP(X) do { \
(X).total += rarch_get_perf_counter() - (X).start; \
} while(0)
#ifdef _WIN32 #ifdef _WIN32
#define RARCH_PERFORMANCE_LOG(functionname, X) RARCH_LOG("[PERF]: Avg (%s): %I64u ticks.\n", functionname, (X).total / (X).call_cnt) #define RARCH_PERFORMANCE_LOG(functionname, X) RARCH_LOG("[PERF]: Avg (%s): %I64u ticks, %I64u runs.\n", \
functionname, \
(X).total / (X).call_cnt, \
(X).call_cnt)
#else #else
#define RARCH_PERFORMANCE_LOG(functionname, X) RARCH_LOG("[PERF]: Avg (%s): %llu ticks.\n", functionname, (X).total / (X).call_cnt) #define RARCH_PERFORMANCE_LOG(functionname, X) RARCH_LOG("[PERF]: Avg (%s): %llu ticks, %llu runs.\n", \
functionname, \
(long long unsigned)((X).total / (X).call_cnt), \
(long long unsigned)((X).call_cnt))
#endif #endif
#else #else

View File

@ -1107,7 +1107,6 @@ static bool gl_frame(void *data, const void *frame, unsigned width, unsigned hei
RARCH_PERFORMANCE_START(copy_frame); RARCH_PERFORMANCE_START(copy_frame);
gl_copy_frame(gl, frame, width, height, pitch); gl_copy_frame(gl, frame, width, height, pitch);
RARCH_PERFORMANCE_STOP(copy_frame); RARCH_PERFORMANCE_STOP(copy_frame);
RARCH_PERFORMANCE_LOG("gl_copy_frame", copy_frame);
} }
struct gl_tex_info tex_info = {0}; struct gl_tex_info tex_info = {0};
@ -1144,7 +1143,6 @@ static bool gl_frame(void *data, const void *frame, unsigned width, unsigned hei
#endif #endif
RARCH_PERFORMANCE_STOP(frame_run); RARCH_PERFORMANCE_STOP(frame_run);
RARCH_PERFORMANCE_LOG("gl_frame", frame_run);
#ifdef RARCH_CONSOLE #ifdef RARCH_CONSOLE
if (!gl->block_swap) if (!gl->block_swap)

View File

@ -192,9 +192,6 @@ void scaler_ctx_gen_reset(struct scaler_ctx *ctx)
void scaler_ctx_scale(struct scaler_ctx *ctx, void scaler_ctx_scale(struct scaler_ctx *ctx,
void *output, const void *input) void *output, const void *input)
{ {
RARCH_PERFORMANCE_INIT(scaler_perf);
RARCH_PERFORMANCE_START(scaler_perf);
if (ctx->unscaled) // Just perform straight pixel conversion. if (ctx->unscaled) // Just perform straight pixel conversion.
{ {
ctx->direct_pixconv(output, input, ctx->direct_pixconv(output, input,
@ -262,8 +259,5 @@ void scaler_ctx_scale(struct scaler_ctx *ctx,
else else
ctx->scaler_vert(ctx, output, ctx->out_stride); ctx->scaler_vert(ctx, output, ctx->out_stride);
} }
RARCH_PERFORMANCE_STOP(scaler_perf);
RARCH_PERFORMANCE_LOG("Scaler", scaler_perf);
} }

View File

@ -397,7 +397,6 @@ static bool vg_frame(void *data, const void *frame, unsigned width, unsigned hei
RARCH_PERFORMANCE_START(vg_image); RARCH_PERFORMANCE_START(vg_image);
vg_copy_frame(vg, frame, width, height, pitch); vg_copy_frame(vg, frame, width, height, pitch);
RARCH_PERFORMANCE_STOP(vg_image); RARCH_PERFORMANCE_STOP(vg_image);
RARCH_PERFORMANCE_LOG("vg_copy_frame", vg_image);
vgDrawImage(vg->mImage); vgDrawImage(vg->mImage);
@ -409,8 +408,6 @@ static bool vg_frame(void *data, const void *frame, unsigned width, unsigned hei
#endif #endif
RARCH_PERFORMANCE_STOP(vg_fr); RARCH_PERFORMANCE_STOP(vg_fr);
RARCH_PERFORMANCE_LOG("vg_frame", vg_fr);
vg->driver->swap_buffers(); vg->driver->swap_buffers();
return true; return true;

View File

@ -272,7 +272,6 @@ static void video_frame(const void *data, unsigned width, unsigned height, size_
data = driver.scaler_out; data = driver.scaler_out;
pitch = driver.scaler.out_stride; pitch = driver.scaler.out_stride;
RARCH_PERFORMANCE_STOP(video_frame_conv); RARCH_PERFORMANCE_STOP(video_frame_conv);
RARCH_PERFORMANCE_LOG("video_frame_conv()", video_frame_conv);
} }
// Slightly messy code, // Slightly messy code,
@ -2772,6 +2771,11 @@ int rarch_main(int argc, char *argv[])
while (rarch_main_iterate()); while (rarch_main_iterate());
rarch_main_deinit(); rarch_main_deinit();
rarch_deinit_msg_queue(); rarch_deinit_msg_queue();
#ifdef PERF_TEST
rarch_perf_log();
#endif
rarch_main_clear_state(); rarch_main_clear_state();
return 0; return 0;
} }