Some simple code to use a Stopwatch class to measure how long a piece of code takes to run. With this extension you can forget about the Stopwatch syntax:
namespace Utilities.StopwatchExtensions { public static class StopwatchExtender { public static TimeSpan MeasureRunTime(this Action codeToRun) { var stopWatch = Stopwatch.StartNew(); codeToRun(); stopWatch.Stop(); return stopWatch.Elapsed; } } }
From .NET 7.0 you can use this form:
namespace Utilities.StopwatchExtensions { public static class StopwatchExtender { public static TimeSpan MeasureRunTime(this Action codeToRun) { long startTime = Stopwatch.GetTimestamp();; codeToRun(); TimeSpan elapsedTime = Stopwatch.GetElapsedTime(startTime); } } }Or put them together
namespace Utilities.StopwatchExtensions { /// <summary> /// Stopwatch extension tomeasure the time to perform an Action /// </summary> /// <example> /// <code> /// Action work = () => list = someDb.Get().ToList(); /// var timeTakenMs = work.MeasureRunTime().TotalMilliseconds; /// </code> /// </example> public static class StopwatchExtender { public static TimeSpan MeasureRunTime(this Action codeToRun) { TimeSpan elapsedTime = TimeSpan.Zero; #if NET7_0_OR_GREATER var startTime = Stopwatch.GetTimestamp(); codeToRun(); elapsedTime = Stopwatch.GetElapsedTime(startTime); #else var sw = Stopwatch.StartNew(); codeToRun(); sw.Stop(); elapsedTime = sw.Elapsed; #endif return elapsedTime; } } }Remember to wrap the extension in a specific isolating namespace otherwise the intelli-editor in Visual Studio will get polluted with unused extension methods. To use:
Action codeToRun = () => { /* code whose execution time needs measuring */}; var runTimeMs = codeToRun.MeasureRunTime().TotalMilliseconds; Trace.WriteLine("*** Time to complete task: " + runTimeMs + " ms"); using (var process = Process.GetCurrentProcess()) { Trace.WriteLine($"*** Execution time: {runTimeMs.ToString()} ms"); Trace.WriteLine($"*** Gen-0: {GC.CollectionCount(0).ToString()}"); Trace.WriteLine($"*** Gen-1: {GC.CollectionCount(1).ToString()}"); Trace.WriteLine($"*** Gen-2: {GC.CollectionCount(2).ToString()}"); Trace.WriteLine($"*** Peak WrkSet: {process.PeakWorkingSet64.ToString("n0")}"); }
No comments:
Post a Comment