Как в методе с атрибутом [ArgumentsSource()] определяется, придет ли каждый раз новый объект для теста или тот же объект повторится 1000 раз? Как можно понять, что пришло, если приложение Debug не поддерживает Benchmark? Почему происходят проблемы с некорректным отображением времени без вызова метода сброса входного параметра перед возвратом? Как можно объяснить, будет ли каждый раз новый объект приходить для каждой итерации каждого метода?
В BenchmarkDotNet аргументы передаются через атрибуты [Params] либо через методы, помеченные атрибутом [ArgumentsSource]. В методе с атрибутом [ArgumentsSource] каждый раз будет создаваться новый объект для теста, если метод возвращает IEnumerable с объектами, которые будут использоваться в качестве параметров для каждой итерации теста. Если же метод возвращает IEnumerable с одним и тем же объектом, то этот объект будет повторяться каждый раз. Если приложение в режиме Debug не поддерживает работу с BenchmarkDotNet, то можно воспользоваться другими инструментами, такими как PerfView, для анализа производительности. Проблемы с некорректным отображением времени могут возникать из-за того, что не происходит сброс входных параметров перед возвратом значения из метода. Следует обратить внимание на то, чтобы входные параметры были корректно сброшены после завершения каждого теста. Чтобы определить, будет ли каждый раз создаваться новый объект для каждой итерации каждого метода, необходимо изучить логику создания и использования объектов в коде каждого метода. В зависимости от реализации, объекты могут быть созданы заново для каждой итерации или сохраняться между итерациями.
Разве для каждого метода, каждой итерации не новый объект приходит?
Судя по исходному коду ( https://github.com/dotnet/BenchmarkDotNet/blob/109... ), аргументы создаются во время создания объекта бенчмарка.
Если тебе нужно на каждую итерацию создавать новый объект и работать с ним, то для этого используются Setup/Teardown методы. Их помечать через[IterationSetup]/[IterationCleanup]
атрибуты надо.
Примерно так:
public class SampleBenchmark { private object _object; [IterationSetup] public void MySetup() { _object = CreateData(1000); } [IterationCleanup] public void MyCleanUp() { _object = null; } [Benchmark] public void Benchmark() { _object.DoSomething(); } }
как вообще можно узнать что пришло, если какой-то гений придумал что в Debug не работает Benchmark, гений
BenchmarkDotNet использутся для замера производительности. В него помещается изначально правильно работающий код, производительность которого нужно замерить для будующих запусков в проде. В дебаг режиме есть много лишнего, неоптимизированного кода, поэтому производительность будет ниже и, чтобы таких ситуаций не было сделали такое ограничение.
Если тебе нужно дебажить - то это юнит (xUnit, NUint, MSTest) и другие виды тестирования