using HarmonyLib; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; namespace NewHorizons.Patches; /// /// attach profiler markers to important methods /// [HarmonyPatch] public static class ProfilerPatch { [HarmonyTargetMethods] public static IEnumerable TargetMethods() { foreach (var type in Assembly.GetExecutingAssembly().GetTypes()) { // only allow builders for now if (!type.Name.EndsWith("Builder")) continue; foreach (var method in type.GetMethods()) { // make and init methods if (!(method.Name.StartsWith("Make") || method.Name.StartsWith("Init"))) continue; Main.Instance.ModHelper.Console.WriteLine($"[profiler] profiling method {method.DeclaringType.Name}.{method.Name}"); yield return method; } } } [HarmonyPrefix] public static void Prefix(out Stopwatch __state) { __state = new Stopwatch(); __state.Start(); } [HarmonyPostfix] public static void Postfix(MethodBase __originalMethod, Stopwatch __state) { __state.Stop(); Main.Instance.ModHelper.Console.WriteLine($"[profiler] method {__originalMethod.DeclaringType.Name}.{__originalMethod.Name} took {__state.Elapsed.TotalMilliseconds} ms"); } }