From f37c877160bebd9593f2f147c7183fb19f7eb309 Mon Sep 17 00:00:00 2001 From: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> Date: Thu, 4 Nov 2021 17:09:34 -0700 Subject: [PATCH] Splits init profiles into a seperate log file (#62545) * Splits init profiles into their own file, so we can better track where pain points come from. After all there's no point in knowing that sprite sheets generate 32 seconds of overtime during init if you only care about inround, or vis versa. (I'm tired of people freaking out about blends that are only done during init) * Whoops --- code/__DEFINES/subsystems.dm | 2 +- code/controllers/subsystem/init_profiler.dm | 25 +++++++++++++++++++++ tgstation.dme | 1 + 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 code/controllers/subsystem/init_profiler.dm diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 228731d5ec3..911b828a519 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -158,7 +158,7 @@ #define INIT_ORDER_PATH -50 #define INIT_ORDER_EXPLOSIONS -69 #define INIT_ORDER_STATPANELS -98 -#define INIT_ORDER_DEMO -99 // o avoid a bunch of changes related to initialization being written, do this last +#define INIT_ORDER_INIT_PROFILER -99 //Near the end, logs the costs of initialize #define INIT_ORDER_CHAT -100 //Should be last to ensure chat remains smooth during init. // Subsystem fire priority, from lowest to highest priority diff --git a/code/controllers/subsystem/init_profiler.dm b/code/controllers/subsystem/init_profiler.dm new file mode 100644 index 00000000000..02fdc307c94 --- /dev/null +++ b/code/controllers/subsystem/init_profiler.dm @@ -0,0 +1,25 @@ +#define INIT_PROFILE_NAME "init_profiler.json" + +///Subsystem exists so we can seperately log init time costs from the costs of general operation +///Hopefully this makes sorting out what causes problems when easier +SUBSYSTEM_DEF(init_profiler) + name = "Init Profiler" + init_order = INIT_ORDER_INIT_PROFILER + flags = SS_NO_FIRE + +/datum/controller/subsystem/init_profiler/Initialize() + if(CONFIG_GET(flag/auto_profile)) + write_init_profile() + return ..() + +/datum/controller/subsystem/init_profiler/proc/write_init_profile() + var/current_profile_data = world.Profile(PROFILE_REFRESH, format = "json") + CHECK_TICK + + if(!length(current_profile_data)) //Would be nice to have explicit proc to check this + stack_trace("Warning, profiling stopped manually before dump.") + var/prof_file = file("[GLOB.log_directory]/[INIT_PROFILE_NAME]") + if(fexists(prof_file)) + fdel(prof_file) + WRITE_FILE(prof_file, current_profile_data) + world.Profile(PROFILE_CLEAR) //Now that we're written this data out, dump it. We don't want it getting mixed up with our current round data diff --git a/tgstation.dme b/tgstation.dme index 16b89d3885b..ed3160859b2 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -364,6 +364,7 @@ #include "code\controllers\subsystem\icon_smooth.dm" #include "code\controllers\subsystem\id_access.dm" #include "code\controllers\subsystem\idlenpcpool.dm" +#include "code\controllers\subsystem\init_profiler.dm" #include "code\controllers\subsystem\input.dm" #include "code\controllers\subsystem\ipintel.dm" #include "code\controllers\subsystem\job.dm"