Profiler.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. using System;
  2. using System.Diagnostics;
  3. using System.Linq;
  4. using System.Runtime.CompilerServices;
  5. using InABox.Core;
  6. namespace InABox.Core
  7. {
  8. public class Profiler : IDisposable
  9. {
  10. private Stopwatch _stopwatch;
  11. protected string MethodName { get; set; }
  12. public string? ClassName { get; set; }
  13. private bool _logOnDispose = false;
  14. public Profiler(bool logOnDispose, [CallerMemberName] string methodName = "") : base()
  15. {
  16. _logOnDispose = logOnDispose;
  17. MethodName = methodName;
  18. _stopwatch = new Stopwatch();
  19. _stopwatch.Start();
  20. }
  21. public long GetElapsedMilliseconds() => _stopwatch.ElapsedMilliseconds;
  22. public void Pause() => _stopwatch.Stop();
  23. public void Resume() => _stopwatch.Start();
  24. public long Restart()
  25. {
  26. var ms = _stopwatch.ElapsedMilliseconds;
  27. _stopwatch.Restart();
  28. return ms;
  29. }
  30. public void Log()
  31. {
  32. _stopwatch.Stop();
  33. Logger.Send(LogType.Information, "", $"- {MethodName}{ClassName}() returned in {_stopwatch.ElapsedMilliseconds}ms");
  34. _stopwatch.Restart();
  35. }
  36. public void Log(int count)
  37. {
  38. _stopwatch.Stop();
  39. Logger.Send(LogType.Information, "", $"- {MethodName}{ClassName}() returned {count} items in {_stopwatch.ElapsedMilliseconds}ms");
  40. _stopwatch.Restart();
  41. }
  42. public void Log(string name)
  43. {
  44. _stopwatch.Stop();
  45. Logger.Send(LogType.Information, "", $"- {MethodName}{ClassName}() [{name}] returned in {_stopwatch.ElapsedMilliseconds}ms");
  46. _stopwatch.Restart();
  47. }
  48. public void Log(string format, params object[] values)
  49. {
  50. _stopwatch.Stop();
  51. Logger.Send(LogType.Information, "", $"- [{String.Format(format,values)}] returned in {_stopwatch.ElapsedMilliseconds}ms");
  52. _stopwatch.Restart();
  53. }
  54. public void Dispose()
  55. {
  56. if (_logOnDispose)
  57. Log();
  58. _stopwatch?.Stop();
  59. _stopwatch = null;
  60. }
  61. public void Dispose(int count)
  62. {
  63. if (_logOnDispose)
  64. Log(count);
  65. _stopwatch?.Stop();
  66. _stopwatch = null;
  67. }
  68. }
  69. public class Profiler<T> : Profiler
  70. {
  71. public Profiler(bool logOnDispose, [CallerMemberName] string methodName = "") : base(logOnDispose, methodName)
  72. {
  73. ClassName = typeof(T).Name.Split('.').Last();
  74. }
  75. }
  76. }