暂无描述
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using Unity.PerformanceTesting.Exceptions;
  5. using UnityEngine;
  6. namespace Unity.PerformanceTesting.Runtime
  7. {
  8. internal static class Utils
  9. {
  10. public static string ResourcesPath => Path.Combine(Application.dataPath, "Resources");
  11. public const string TestRunPath = "Assets/Resources/" + TestRunInfo;
  12. public const string TestRunInfo = "PerformanceTestRunInfo.json";
  13. public const string PlayerPrefKeyRunJSON = "PT_Run";
  14. public const string RunSettingsPath = "Assets/Resources/" + RunSettings;
  15. public const string RunSettings = "PerformanceTestRunSettings.json";
  16. public const string PlayerPrefKeySettingsJSON = "PT_Settings";
  17. public static DateTime ConvertFromUnixTimestamp(long timestamp)
  18. {
  19. var offset = DateTimeOffset.FromUnixTimeMilliseconds(timestamp);
  20. return offset.UtcDateTime;
  21. }
  22. public static long ConvertToUnixTimestamp(DateTime date)
  23. {
  24. var offset = new DateTimeOffset(date);
  25. return offset.ToUnixTimeMilliseconds();
  26. }
  27. public static double ConvertSample(SampleUnit from, SampleUnit to, double value)
  28. {
  29. if (from.Equals(to)) return value;
  30. var ratio = GetRatio(from, to);
  31. return value * ratio;
  32. }
  33. public static double GetRatio(SampleUnit from, SampleUnit to)
  34. {
  35. double f = RelativeSampleUnit(from);
  36. double t = RelativeSampleUnit(to);
  37. return f / t;
  38. }
  39. public static double RelativeSampleUnit(SampleUnit unit)
  40. {
  41. switch (unit)
  42. {
  43. case SampleUnit.Nanosecond:
  44. return 1;
  45. case SampleUnit.Microsecond:
  46. return 1000;
  47. case SampleUnit.Millisecond:
  48. return 1000000;
  49. case SampleUnit.Second:
  50. return 1000000000;
  51. case SampleUnit.Byte:
  52. return 1;
  53. case SampleUnit.Kilobyte:
  54. return 1000;
  55. case SampleUnit.Megabyte:
  56. return 1000000;
  57. case SampleUnit.Gigabyte:
  58. return 1000000000;
  59. default:
  60. throw new PerformanceTestException(
  61. "Wrong SampleUnit type used.");
  62. }
  63. }
  64. public static void UpdateStatistics(this SampleGroup sampleGroup)
  65. {
  66. if (sampleGroup.Samples == null) return;
  67. var samples = sampleGroup.Samples;
  68. if (samples.Count < 2)
  69. {
  70. sampleGroup.Min = samples[0];
  71. sampleGroup.Max = samples[0];
  72. sampleGroup.Median = samples[0];
  73. sampleGroup.Average = samples[0];
  74. sampleGroup.Sum = samples[0];
  75. sampleGroup.StandardDeviation = 0;
  76. }
  77. else
  78. {
  79. sampleGroup.Min = Utils.Min(samples);
  80. sampleGroup.Max = Utils.Max(samples);
  81. sampleGroup.Median = Utils.GetMedianValue(samples);
  82. sampleGroup.Average = Utils.Average(samples);
  83. sampleGroup.Sum = Utils.Sum(samples);
  84. sampleGroup.StandardDeviation = Utils.GetStandardDeviation(samples, sampleGroup.Average);
  85. }
  86. }
  87. public static int GetZeroValueCount(List<double> samples)
  88. {
  89. var zeroValues = 0;
  90. foreach (var sample in samples)
  91. {
  92. if (Math.Abs(sample) < .0001f)
  93. {
  94. zeroValues++;
  95. }
  96. }
  97. return zeroValues;
  98. }
  99. public static double GetMedianValue(List<double> samples)
  100. {
  101. var samplesClone = new List<double>(samples);
  102. var middleIndex = samplesClone.Count / 2;
  103. samplesClone.Sort();
  104. return samplesClone.Count % 2 != 0
  105. ? samplesClone[middleIndex]
  106. : (samplesClone[middleIndex - 1] + samplesClone[middleIndex]) / 2.0;
  107. }
  108. public static double GetPercentile(List<double> samples, double percentile)
  109. {
  110. if (percentile < 0.00001D)
  111. return percentile;
  112. var samplesClone = new List<double>(samples);
  113. samplesClone.Sort();
  114. if (samplesClone.Count == 1)
  115. {
  116. return samplesClone[0];
  117. }
  118. var rank = percentile * (samplesClone.Count + 1);
  119. var integral = (int)rank;
  120. var fractional = rank % 1;
  121. return samplesClone[integral - 1] + fractional * (samplesClone[integral] - samplesClone[integral - 1]);
  122. }
  123. public static double GetStandardDeviation(List<double> samples, double average)
  124. {
  125. double sumOfSquaresOfDifferences = 0.0D;
  126. foreach (var sample in samples)
  127. {
  128. sumOfSquaresOfDifferences += (sample - average) * (sample - average);
  129. }
  130. return Math.Sqrt(sumOfSquaresOfDifferences / samples.Count);
  131. }
  132. public static double Min(List<double> samples)
  133. {
  134. double min = Mathf.Infinity;
  135. foreach (var sample in samples)
  136. {
  137. if (sample < min) min = sample;
  138. }
  139. return min;
  140. }
  141. public static double Max(List<double> samples)
  142. {
  143. double max = Mathf.NegativeInfinity;
  144. foreach (var sample in samples)
  145. {
  146. if (sample > max) max = sample;
  147. }
  148. return max;
  149. }
  150. public static double Average(List<double> samples)
  151. {
  152. return Sum(samples) / samples.Count;
  153. }
  154. public static double Sum(List<double> samples)
  155. {
  156. double sum = 0.0D;
  157. foreach (var sample in samples)
  158. {
  159. sum += sample;
  160. }
  161. return sum;
  162. }
  163. public static string RemoveIllegalCharacters(string path)
  164. {
  165. string invalid = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());
  166. foreach (char c in invalid)
  167. {
  168. path = path.Replace(c.ToString(), "");
  169. }
  170. return path;
  171. }
  172. public static string GetArg(string[] args, string name)
  173. {
  174. for (int i = 0; i < args.Length; i++)
  175. {
  176. if (args[i] == name && args.Length > i + 1)
  177. {
  178. return args[i + 1];
  179. }
  180. }
  181. return null;
  182. }
  183. internal static int ToInt(this string s)
  184. {
  185. if (int.TryParse(s, out var i)) return i;
  186. return -1;
  187. }
  188. internal static SampleGroup[] CreateSampleGroupsFromMarkerNames(params string[] profilerMarkerNames)
  189. {
  190. if (profilerMarkerNames == null) return new List<SampleGroup>().ToArray();
  191. var sampleGroups = new List<SampleGroup>();
  192. foreach (var marker in profilerMarkerNames)
  193. {
  194. sampleGroups.Add(new SampleGroup(marker, SampleUnit.Nanosecond, false));
  195. }
  196. return sampleGroups.ToArray();
  197. }
  198. }
  199. }