Під час розробки програмного забезпечення одним із важливих етапів є вимірювання продуктивності коду. Для вирішення цієї задачі розробники зазвичай використовують інструменти для бенчмаркінгу, такі як BenchmarkDotnet. Цей інструмент дозволяє вимірювати час виконання окремих методів або функцій, що дозволяє виявити та виправити можливі проблеми з продуктивністю.
Однією з основних задач бенчмаркінгу є виконання точної кількості ітерацій для кожного тесту. У більшості випадків, BenchmarkDotnet автоматично вирішує, скільки разів потрібно виконати код для отримання достатньої статистичної значимості. Однак, у деяких випадках може виникнути потреба в явному вказанні кількості ітерацій.
Уявімо ситуацію, де ми хочемо порівняти продуктивність двох методів завантаження API: одного з антивірусним скануванням інформації та одного без нього. Ми використовуємо BenchmarkDotnet для вимірювання часу виконання кожного методу, проте хочемо, щоб кожен метод виконувався точно задану кількість разів для точних порівнянь.
Ось як ми можемо налаштувати BenchmarkDotnet для досягнення цієї мети:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
var config = new ManualConfig(); var job = Job.Default; job.Run.RunStrategy = RunStrategy.Throughput; job.Run.TargetCount = 100; job.Run.LaunchCount = 1; job.Run.WarmupCount = 3; job.Run.IterationTime = 1000; job.Run.InvocationCount = 1; config.AddJob(job); config.Add(DefaultConfig.Instance.GetExporters().ToArray()); config.Add(DefaultConfig.Instance.GetLoggers().ToArray()); config.Add(DefaultConfig.Instance.GetColumnProviders().ToArray()); BenchmarkRunner.Run<HttpClientBenchmark>(config); public class HttpClientBenchmark { private HttpClient _httpClient; [GlobalSetup] public void GlobalSetup() { _httpClient = new HttpClient(); } [Benchmark] [Params(50, 100, 200)] // Встановлюємо різну кількість ітерацій для кожного методу public async Task<string> PostWithAV(int iterations) { // Реалізація методу залишається незмінною } [Benchmark] [Params(50, 100, 200)] // Встановлюємо різну кількість ітерацій для кожного методу public async Task<string> PostWithoutAV(int iterations) { // Реалізація методу залишається незмінною } } |
У цьому модифікованому коді ми використовуємо атрибут Params
для вказання різної кількості ітерацій для методів PostWithAV()
та PostWithoutAV()
. Значення (50, 100, 200)
представляють кількість ітерацій, які ми хочемо виміряти для кожного методу.
З використанням атрибуту Params
разом з BenchmarkDotnet
ми можемо точно контролювати кількість ітерацій для кожного методу бенчмаркінгу, що відповідає початковому питанню та допомагає забезпечити точні результати порівнянь продуктивності.