From 78078c3598737d910375759925fdfccc7b68b8e1 Mon Sep 17 00:00:00 2001 From: o9000 Date: Sat, 8 Oct 2016 15:36:01 +0200 Subject: [PATCH] Add profiling code to 0.11 --- src/tint.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/src/tint.c b/src/tint.c index 4d9e6b8..b342d3b 100644 --- a/src/tint.c +++ b/src/tint.c @@ -30,6 +30,8 @@ #include #include #include +#include +#include #ifdef HAVE_SN #include @@ -57,6 +59,7 @@ Atom dnd_selection; Atom dnd_atom; int dnd_sent_request; char *dnd_launcher_exec; +gboolean debug_fps = FALSE; void signal_handler(int sig) { @@ -123,6 +126,7 @@ void init (int argc, char *argv[]) // sigaddset(&block_mask, SIGHUP); // sigaddset(&block_mask, SIGUSR1); // sigprocmask(SIG_BLOCK, &block_mask, 0); + debug_fps = getenv("DEBUG_FPS") != NULL; } #ifdef HAVE_SN @@ -998,7 +1002,7 @@ void dnd_drop(XClientMessageEvent *e) //The source is sending anyway, despite instructions to the contrary. //So reply that we're not interested. XClientMessageEvent m; - memset(&m, sizeof(m), 0); + memset(&m, 0, sizeof(m)); m.type = ClientMessage; m.display = e->display; m.window = e->data.l[0]; @@ -1011,6 +1015,19 @@ void dnd_drop(XClientMessageEvent *e) } } +double get_time() +{ + struct timespec cur_time; + clock_gettime(CLOCK_MONOTONIC, &cur_time); + return cur_time.tv_sec + cur_time.tv_nsec * 1.0e-9; +} + +#define GREEN "\033[1;32m" +#define YELLOW "\033[1;33m" +#define RED "\033[1;31m" +#define BLUE "\033[1;34m" +#define RESET "\033[0m" + int main (int argc, char *argv[]) { XEvent e; @@ -1061,8 +1078,15 @@ start: // sigset_t empty_mask; // sigemptyset(&empty_mask); + double ts_event_read = 0; + double ts_event_processed = 0; + double ts_render_finished = 0; + double ts_flush_finished = 0; + double fps_sum = 0, fps_count = 0; while (1) { if (panel_refresh) { + if (debug_fps) + ts_event_processed = get_time(); panel_refresh = 0; for (i=0 ; i < nb_panel ; i++) { @@ -1089,6 +1113,26 @@ start: // force icon's refresh refresh_systray_icon(); } + + if (debug_fps) + ts_render_finished = get_time(); + if (debug_fps && ts_event_read > 0) { + ts_flush_finished = get_time(); + double period = ts_flush_finished - ts_event_read; + double fps = 1.0 / period; + double proc_ratio = (ts_event_processed - ts_event_read) / period; + double render_ratio = (ts_render_finished - ts_event_processed) / period; + double flush_ratio = (ts_flush_finished - ts_render_finished) / period; + fps_sum += fps; + fps_count += 1; + fprintf(stderr, + BLUE "fps = %.0f (avg %.0f) : processing %.0f%%, rendering %.0f%%, flushing %.0f%%" RESET "\n", + fps, + fps_sum / fps_count, + proc_ratio * 100, + render_ratio * 100, + flush_ratio * 100); + } } // thanks to AngryLlama for the timer @@ -1102,9 +1146,12 @@ start: timeout = 0; // Wait for X Event or a Timer + ts_event_read = 0; if (select(x11_fd+1, &fdset, 0, 0, timeout) > 0) { while (XPending (server.dsp)) { XNextEvent(server.dsp, &e); + if (debug_fps) + ts_event_read = get_time(); #if HAVE_SN sn_display_process_event (server.sn_dsp, &e); #endif // HAVE_SN @@ -1304,7 +1351,7 @@ start: // Reply OK. XClientMessageEvent m; - memset(&m, sizeof(m), 0); + memset(&m, 0, sizeof(m)); m.type = ClientMessage; m.display = server.dsp; m.window = dnd_source_window;