using AyCode.Core.Helpers; using BenchmarkDotNet.Attributes; using Microsoft.VSDiagnostics; namespace AyCode.Core.Benchmarks; [CPUUsageDiagnoser] public class TaskHelperBenchmarks { private volatile bool _flag; private int _counter; private Action _incrementAction = null !; private Func _incrementFunc = null !; private Func> _incrementAsyncFunc = null !; [GlobalSetup] public void Setup() { _incrementAction = () => _counter++; _incrementFunc = () => ++_counter; _incrementAsyncFunc = async () => { await Task.Yield(); return ++_counter; }; } [IterationSetup] public void IterationSetup() { _flag = true; // Pre-set for immediate success _counter = 0; } #region WaitToAsync Benchmarks [Benchmark(Description = "WaitToAsync - immediate success")] [BenchmarkCategory("WaitToAsync")] public Task WaitToAsync_ImmediateSuccess() => TaskHelper.WaitToAsync(() => _flag, 1000, 1); [Benchmark(Description = "WaitToAsync - short timeout (100ms)")] [BenchmarkCategory("WaitToAsync")] public Task WaitToAsync_ShortTimeout() => TaskHelper.WaitToAsync(() => true, 100, 1); #endregion #region ToThreadPoolTask Benchmarks [Benchmark(Description = "ToThreadPoolTask - Action")] [BenchmarkCategory("ThreadPool")] public Task ToThreadPoolTask_Action() => _incrementAction.ToThreadPoolTask(); [Benchmark(Description = "ToThreadPoolTask - Func")] [BenchmarkCategory("ThreadPool")] public Task ToThreadPoolTask_FuncT() => _incrementFunc.ToThreadPoolTask(); [Benchmark(Description = "ToThreadPoolTask - Func>")] [BenchmarkCategory("ThreadPool")] public Task ToThreadPoolTask_FuncTaskT() => _incrementAsyncFunc.ToThreadPoolTask(); [Benchmark(Description = "Task.Run baseline - Action")] [BenchmarkCategory("ThreadPool")] public Task TaskRun_Action_Baseline() => Task.Run(_incrementAction); #endregion #region Timing Method Comparison [Benchmark(Description = "DateTime.UtcNow.Ticks")] [BenchmarkCategory("Timing")] public long DateTimeUtcNow_Ticks() => DateTime.UtcNow.Ticks; [Benchmark(Description = "Environment.TickCount64")] [BenchmarkCategory("Timing")] public long EnvironmentTickCount64() => Environment.TickCount64; [Benchmark(Description = "DateTime.UtcNow.AddMilliseconds")] [BenchmarkCategory("Timing")] public long DateTimeUtcNow_AddMilliseconds() => DateTime.UtcNow.AddMilliseconds(1000).Ticks; #endregion }