Обложка канала

.NET Разработчик

Опытный разработчик не так давно зашёл в .Net и поставил цель получить сертификат Microsoft. Свой ежедневный прогресс он описывает на канале .Net Разработчик. Заметки об изученном материале, советы по повышению производительности и поддержке мотивации, ин

.NET Разработчик

4 года назад
Открыть в
День 1359. #Testing #Benchmark Руководство по Бенчмарку в .NET. Продолжение Начало Мы можем выводить дополнительную информацию в отчёте с помощью атрибутов. Память Наверное, самым популярным является MemoryDiagnoser, позволяющий посмотреть информацию о потребляемой памяти и количестве сборок мусора. Базовый случай Иногда полезно обозначить базовый метод, относительно которого мы будем считать, насколько быстрее (или медленнее) работают остальные. Это можно сделать, добавив в атрибут Benchmark параметр Baseline=true. Параметры Можно посмотреть, как себя ведёт метод в зависимости от объёма данных. В этом поможет атрибут Params(…), в который надо передать массив размеров входных данных. Среда исполнения Мы можем сравнить быстродействие кода в разных средах исполнения. Например, .NET 6.0 с .NET 7.0. Для этого используется атрибут SimpleJob(RuntimeMoniker.…). Убедитесь, что у вас установлена версия BetnchmarkDotNet 0.13 или выше, чтобы тестировать в средах .NET 5.0 и выше. Также убедитесь, что все эти среды исполнения установлены на вашей машине. Собираем всё вместе:
namespace StringBenchmarks {
  [MemoryDiagnoser]
  [SimpleJob(RuntimeMoniker.Net50)]
  [SimpleJob(RuntimeMoniker.Net60, baseline: true)]
  [SimpleJob(RuntimeMoniker.Net70)]
  public class Benchmarks
  {
    [Params(5, 50, 500)]
    public int N { get; set; }

    [Benchmark(Baseline = true)]
    public string StringJoin()
    {
      return string.Join(", ", 
       Enumerable.Range(0, N)
        .Select(i => i.ToString()));
    }

    [Benchmark]
    public string StringBuilder()
    {
      var sb = new StringBuilder();
      for (int i = 0; i < N; i++)
  {
        sb.Append(i);
        sb.Append(", ");
      }

      return sb.ToString();
    }
  }
}

Мы добавили параметр N, которому бенчмарк задаст значения 5, 50 и 500 соответственно в разных тестах. Также мы запустим тесты в 3х средах исполнения: .NET 5.0, .NET 6.0 (базовая среда) и .NET 7.0. Кроме того, добавлена диагностика памяти и за базовый случай взят метод StringJoin. Результаты приведены на картинке ниже. Из результатов, например, заметно, что метод, использующий StringBuilder, с каждой новой версией .NET работает всё быстрее. Не обязательно просматривать результаты в консоли. BenchmarkDotNet выводит результаты в папку BenchmarkDotNet.Artifacts. Там будут файлы отчетов в форматах html, csv и markdown. Это может быть очень полезно для добавления в PR или комментарий к релизу на Github или других подобных платформах. Окончание следует… Источник: https://blog.nimblepros.com/blogs/benchmarking-in-dotnet/