diff --git a/code/__DEFINES/math.dm b/code/__DEFINES/math.dm index 534e0d3608b..5b3f51b4e39 100644 --- a/code/__DEFINES/math.dm +++ b/code/__DEFINES/math.dm @@ -10,6 +10,8 @@ #define T20C 293.15 // 20degC #define TCMB 2.7 // -270.3degC +#define SHORT_REAL_LIMIT 16777216 + //"fancy" math for calculating time in ms from tick_usage percentage and the length of ticks //percent_of_tick_used * (ticklag * 100(to convert to ms)) / 100(percent ratio) //collapsed to percent_of_tick_used * tick_lag diff --git a/code/__DEFINES/profile.dm b/code/__DEFINES/profile.dm index bbc229712d9..28fc7782ce3 100644 --- a/code/__DEFINES/profile.dm +++ b/code/__DEFINES/profile.dm @@ -1,19 +1,28 @@ -#define PROFILE_START PROFILE_STORE = list();PROFILE_SET +#define PROFILE_START ;PROFILE_STORE = list();PROFILE_SET; +#define PROFILE_STOP ;PROFILE_STORE = null; -#define PROFILE_SET PROFILE_TIME = TICK_USAGE_REAL; PROFILE_LINE = __LINE__; PROFILE_FILE = __FILE__; PROFILE_SLEEPCHECK = world.time +#define PROFILE_SET ;PROFILE_TIME = TICK_USAGE_REAL; PROFILE_LINE = __LINE__; PROFILE_FILE = __FILE__; PROFILE_SLEEPCHECK = world.time; -#define PROFILE_TICK \ - if (PROFILE_SLEEPCHECK == world.time) {\ - var/PROFILE_STRING = "[PROFILE_FILE]:[PROFILE_LINE] - [__FILE__]:[__LINE__]" \ - var/list/PROFILE_ITEM = PROFILE_STORE[PROFILE_STRING];\ - if (!PROFILE_ITEM) {\ - PROFILE_ITEM = new(PROFILE_ITEM_LEN);\ - PROFILE_STORE[PROFILE_STRING] = PROFILE_ITEM\ - }\ - PROFILE_ITEM[PROFILE_ITEM_TIME] += TICK_USAGE_TO_MS(PROFILE_TIME);\ - PROFILE_ITEM[PROFILE_ITEM_COUNT]++;\ - }\ - PROFILE_SET +#define PROFILE_TICK ;\ + if (PROFILE_STORE) {\ + var/PROFILE_TICK_USAGE_REAL = TICK_USAGE_REAL;\ + if (PROFILE_SLEEPCHECK == world.time) {\ + var/PROFILE_STRING = "[PROFILE_FILE]:[PROFILE_LINE] - [__FILE__]:[__LINE__]";\ + var/list/PROFILE_ITEM = PROFILE_STORE[PROFILE_STRING];\ + if (!PROFILE_ITEM) {\ + PROFILE_ITEM = new(PROFILE_ITEM_LEN);\ + PROFILE_STORE[PROFILE_STRING] = PROFILE_ITEM;\ + PROFILE_ITEM[PROFILE_ITEM_TIME] = 0;\ + PROFILE_ITEM[PROFILE_ITEM_COUNT] = 0;\ + };\ + PROFILE_ITEM[PROFILE_ITEM_TIME] += TICK_DELTA_TO_MS(PROFILE_TICK_USAGE_REAL-PROFILE_TIME);\ + var/PROFILE_INCR_AMOUNT = min(1, 2**round(PROFILE_ITEM[PROFILE_ITEM_COUNT]/SHORT_REAL_LIMIT));\ + if (prob(100/PROFILE_INCR_AMOUNT)) {\ + PROFILE_ITEM[PROFILE_ITEM_COUNT] += PROFILE_INCR_AMOUNT;\ + };\ + };\ + PROFILE_SET;\ + }; #define PROFILE_ITEM_LEN 2 #define PROFILE_ITEM_TIME 1 diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm index 9edad7de67b..17cec51c1e4 100644 --- a/code/__HELPERS/cmp.dm +++ b/code/__HELPERS/cmp.dm @@ -60,4 +60,10 @@ GLOBAL_VAR_INIT(cmp_field, "name") . = B.qdels - A.qdels /proc/cmp_profile_avg_time_dsc(list/A, list/B) - return (B["TIME"]/(B["COUNT"] || 1)) - (A["TIME"]/(A["COUNT"] || 1)) + return (B[PROFILE_ITEM_TIME]/(B[PROFILE_ITEM_COUNT] || 1)) - (A[PROFILE_ITEM_TIME]/(A[PROFILE_ITEM_COUNT] || 1)) + +/proc/cmp_profile_time_dsc(list/A, list/B) + return B[PROFILE_ITEM_TIME] - A[PROFILE_ITEM_TIME] + +/proc/cmp_profile_count_dsc(list/A, list/B) + return B[PROFILE_ITEM_COUNT] - A[PROFILE_ITEM_COUNT] diff --git a/code/datums/profiling.dm b/code/datums/profiling.dm index d336ef32c04..49a80d0eded 100644 --- a/code/datums/profiling.dm +++ b/code/datums/profiling.dm @@ -6,13 +6,13 @@ GLOBAL_REAL_VAR(PROFILE_SLEEPCHECK) GLOBAL_REAL_VAR(PROFILE_TIME) -/proc/profile_show(var/user) - sortTim(PROFILE_STORE, /proc/cmp_profile_avg_time_dsc, TRUE) +/proc/profile_show(user, sort = /proc/cmp_profile_avg_time_dsc) + sortTim(PROFILE_STORE, sort, TRUE) var/list/lines = list() for (var/entry in PROFILE_STORE) var/list/data = PROFILE_STORE[entry] - lines += "[entry] => [num2text(data["TIME"], 10)]ms ([data["COUNT"]]) (avg:[num2text(data["TIME"]/(data["COUNT"] || 1), 99)])" + lines += "[entry] => [num2text(data[PROFILE_ITEM_TIME], 10)]ms ([data[PROFILE_ITEM_COUNT]]) (avg:[num2text(data[PROFILE_ITEM_TIME]/(data[PROFILE_ITEM_COUNT] || 1), 99)])" user << browse("