Profile.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. using Ryujinx.Common;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. using System.IO;
  6. namespace Ryujinx.Debugger.Profiler
  7. {
  8. public static class Profile
  9. {
  10. public static float UpdateRate => _settings.UpdateRate;
  11. public static long HistoryLength => _settings.History;
  12. private static InternalProfile _profileInstance;
  13. private static ProfilerSettings _settings;
  14. [Conditional("USE_DEBUGGING")]
  15. public static void Initialize()
  16. {
  17. var config = ProfilerConfiguration.Load(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ProfilerConfig.jsonc"));
  18. _settings = new ProfilerSettings()
  19. {
  20. Enabled = config.Enabled,
  21. FileDumpEnabled = config.DumpPath != "",
  22. DumpLocation = config.DumpPath,
  23. UpdateRate = (config.UpdateRate <= 0) ? -1 : 1.0f / config.UpdateRate,
  24. History = (long)(config.History * PerformanceCounter.TicksPerSecond),
  25. MaxLevel = config.MaxLevel,
  26. MaxFlags = config.MaxFlags,
  27. };
  28. }
  29. public static bool ProfilingEnabled()
  30. {
  31. #if USE_DEBUGGING
  32. if (!_settings.Enabled)
  33. return false;
  34. if (_profileInstance == null)
  35. _profileInstance = new InternalProfile(_settings.History, _settings.MaxFlags);
  36. return true;
  37. #else
  38. return false;
  39. #endif
  40. }
  41. [Conditional("USE_DEBUGGING")]
  42. public static void FinishProfiling()
  43. {
  44. if (!ProfilingEnabled())
  45. return;
  46. if (_settings.FileDumpEnabled)
  47. DumpProfile.ToFile(_settings.DumpLocation, _profileInstance);
  48. _profileInstance.Dispose();
  49. }
  50. [Conditional("USE_DEBUGGING")]
  51. public static void FlagTime(TimingFlagType flagType)
  52. {
  53. if (!ProfilingEnabled())
  54. return;
  55. _profileInstance.FlagTime(flagType);
  56. }
  57. [Conditional("USE_DEBUGGING")]
  58. public static void RegisterFlagReceiver(Action<TimingFlag> receiver)
  59. {
  60. if (!ProfilingEnabled())
  61. return;
  62. _profileInstance.RegisterFlagReceiver(receiver);
  63. }
  64. [Conditional("USE_DEBUGGING")]
  65. public static void Begin(ProfileConfig config)
  66. {
  67. if (!ProfilingEnabled())
  68. return;
  69. if (config.Level > _settings.MaxLevel)
  70. return;
  71. _profileInstance.BeginProfile(config);
  72. }
  73. [Conditional("USE_DEBUGGING")]
  74. public static void End(ProfileConfig config)
  75. {
  76. if (!ProfilingEnabled())
  77. return;
  78. if (config.Level > _settings.MaxLevel)
  79. return;
  80. _profileInstance.EndProfile(config);
  81. }
  82. public static string GetSession()
  83. {
  84. #if USE_DEBUGGING
  85. if (!ProfilingEnabled())
  86. return null;
  87. return _profileInstance.GetSession();
  88. #else
  89. return "";
  90. #endif
  91. }
  92. public static List<KeyValuePair<ProfileConfig, TimingInfo>> GetProfilingData()
  93. {
  94. #if USE_DEBUGGING
  95. if (!ProfilingEnabled())
  96. return new List<KeyValuePair<ProfileConfig, TimingInfo>>();
  97. return _profileInstance.GetProfilingData();
  98. #else
  99. return new List<KeyValuePair<ProfileConfig, TimingInfo>>();
  100. #endif
  101. }
  102. public static TimingFlag[] GetTimingFlags()
  103. {
  104. #if USE_DEBUGGING
  105. if (!ProfilingEnabled())
  106. return new TimingFlag[0];
  107. return _profileInstance.GetTimingFlags();
  108. #else
  109. return new TimingFlag[0];
  110. #endif
  111. }
  112. public static (long[], long[]) GetTimingAveragesAndLast()
  113. {
  114. #if USE_DEBUGGING
  115. if (!ProfilingEnabled())
  116. return (new long[0], new long[0]);
  117. return _profileInstance.GetTimingAveragesAndLast();
  118. #else
  119. return (new long[0], new long[0]);
  120. #endif
  121. }
  122. }
  123. }