Add profiling code to 0.11

This commit is contained in:
o9000
2016-10-08 15:36:01 +02:00
parent 257cc45adc
commit 78078c3598

View File

@@ -30,6 +30,8 @@
#include <X11/extensions/Xdamage.h>
#include <Imlib2.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
#ifdef HAVE_SN
#include <libsn/sn.h>
@@ -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;