using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading; namespace ScreenConnect; public class PerformanceTracker { private Dictionary taggedTimeResults; private int counter; private long lastOutputResultsMilliescondTick; public PerformanceTracker() { taggedTimeResults = new Dictionary(); lastOutputResultsMilliescondTick = Singleton.Instance.GetMillisecondCount(); } [Conditional("DEBUG")] private void AddTimeResult(string tag, long timeResult) { try { Monitor.Enter(taggedTimeResults); if (taggedTimeResults.ContainsKey(tag)) { taggedTimeResults[tag] += timeResult; } else { taggedTimeResults.Add(tag, timeResult); } } finally { Monitor.Exit(taggedTimeResults); } } public T Track(string tag, Func func) { long millisecondCount = Singleton.Instance.GetMillisecondCount(); T result = func(); Singleton.Instance.GetMillisecondCount(); return result; } [Conditional("DEBUG")] public void Track(string tag, Proc proc) { long millisecondCount = Singleton.Instance.GetMillisecondCount(); proc(); Singleton.Instance.GetMillisecondCount(); _ = Singleton.Instance.GetMillisecondCount() - lastOutputResultsMilliescondTick; _ = 10000; } [Conditional("DEBUG")] public void OutputResults() { try { Monitor.Enter(taggedTimeResults); long elapsedTrackingTime = Singleton.Instance.GetMillisecondCount() - lastOutputResultsMilliescondTick; if (elapsedTrackingTime != 0L) { lock (TypeTrace.Source) { TypeTrace.TraceMessage($"elapsed time: {elapsedTrackingTime}, fps: {(float)counter * 1000f / (float)elapsedTrackingTime:0.00}"); taggedTimeResults.OrderBy((KeyValuePair _) => _.Key).ForEach2(delegate(KeyValuePair _) { TypeTrace.TraceMessage($" {_.Key}, elapsed time: {_.Value}, {(float)_.Value * 100f / (float)elapsedTrackingTime:0.00}%"); }); } } taggedTimeResults.Clear(); counter = 0; lastOutputResultsMilliescondTick = Singleton.Instance.GetMillisecondCount(); } finally { Monitor.Exit(taggedTimeResults); } } [Conditional("DEBUG")] public void IncrementCounter() { counter++; } }