/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Test/Perf/Utilities/TraceManager.cs
211 строк
6 KB
Cyrus Najmabadi
Sort usings
19 июн 2025, 03:07
19 июн 2025, 03:07
b2899f6
Код
Авторство
О чём код?
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #nullable disable using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using static Roslyn.Test.Performance.Utilities.TestUtilities; namespace Roslyn.Test.Performance.Utilities { public static class TraceManagerFactory { public static ITraceManager GetBestTraceManager() { var cpcFullPath = Path.Combine(TestUtilities.GetCPCDirectoryPath(), "CPC.exe"); if (File.Exists(cpcFullPath)) { Log("Found CPC, using it for trace collection"); return new TraceManager(cpcFullPath); } else { Log($"WARNING: Could not find CPC at {cpcFullPath} (no traces will be collected)"); return new WallClockTraceManager(); } } public static ITraceManager NoOpTraceManager() { return new WallClockTraceManager(); } } public class TraceManager : ITraceManager { private ScenarioGenerator _scenarioGenerator; private readonly string _cpcPath; private int _startEventAbsoluteInstance = 1; private int _stopEventAbsoluteInstance = 1; public TraceManager(string cpcPath) : base() { _cpcPath = cpcPath; _scenarioGenerator = new ScenarioGenerator(); } public bool HasWarmUpIteration => true; public void Setup() { ShellOutVital(_cpcPath, "/Setup /SkipClean", workingDirectory: TestUtilities.GetCPCDirectoryPath()); } public void Start() { ShellOutVital(_cpcPath, "/Start /SkipClean", workingDirectory: TestUtilities.GetCPCDirectoryPath()); } public void Stop() { var scenariosXmlPath = Path.Combine(GetCPCDirectoryPath(), "scenarios.xml"); var consumptionTempResultsPath = Path.Combine(GetCPCDirectoryPath(), "ConsumptionTempResults.xml"); ShellOutVital(_cpcPath, $"/Stop /SkipClean /ScenarioPath=\"{scenariosXmlPath}\" /ConsumptionTempResultsPath=\"{consumptionTempResultsPath}\"", workingDirectory: TestUtilities.GetCPCDirectoryPath()); } public void Cleanup() { ShellOutVital(_cpcPath, "/Cleanup /SkipClean", workingDirectory: TestUtilities.GetCPCDirectoryPath()); } public void StartScenarios() { _scenarioGenerator.AddScenariosFileStart(); } public void StartScenario(string scenarioName, string processName) { _scenarioGenerator.AddStartScenario(scenarioName, processName); } public void StartEvent() { _scenarioGenerator.AddStartEvent(_startEventAbsoluteInstance); _startEventAbsoluteInstance++; } public void EndEvent() { _scenarioGenerator.AddEndEvent(); _stopEventAbsoluteInstance++; } public void EndScenario() { _scenarioGenerator.AddEndScenario(); } public void EndScenarios() { _scenarioGenerator.AddScenariosFileEnd(); } public void WriteScenarios(string[] scenarios) { foreach (var line in scenarios) { _scenarioGenerator.AddLine(line); } } public void WriteScenariosFileToDisk() { _scenarioGenerator.WriteToDisk(); } public void ResetScenarioGenerator() { _scenarioGenerator = new ScenarioGenerator(); _startEventAbsoluteInstance = 1; _stopEventAbsoluteInstance = 1; } } public class WallClockTraceManager : ITraceManager { private readonly List<long> _durations = []; private string _testName = ""; private Stopwatch _stopwatch; public WallClockTraceManager() { } public bool HasWarmUpIteration => false; public void Initialize() { } // We have one WallClockTraceManager per test, so we don't // need to worry about other tests showing up public void Cleanup() { var totalDuration = _durations.Sum(v => v); var average = _durations.Count != 0 ? totalDuration / _durations.Count : 0; var allString = string.Join(",", _durations); Log($"Wallclock times for {_testName}"); Log($"ALL: [{allString}]"); Log($"AVERAGE: {average}"); } public void EndEvent() { } public void EndScenario() { _stopwatch.Stop(); _durations.Add(_stopwatch.ElapsedMilliseconds); } public void EndScenarios() { } public void ResetScenarioGenerator() { } public void Setup() { } public void Start() { } public void StartEvent() { } public void StartScenarios() { } public void StartScenario(string scenarioName, string processName) { _testName = scenarioName; _stopwatch = Stopwatch.StartNew(); } public void Stop() { } public void WriteScenarios(string[] scenarios) { } public void WriteScenariosFileToDisk() { } } }