@SergeySerge11

Как benchmarkdotnet передает аргументы?

Что за аргументы попадают в метод с атрибутом [ArgumentsSource( )] ( как вообще можно узнать что пришло, если какой-то гений придумал что в Debug не работает Benchmark, гений), Каждый раз новый объект приходит для теста, или один и тот же по 1000 раз?
Cтолкнулся с проблемой, что некорректно время показывает, если только не выполнить reset метод входного параметра перед return. Разве для каждого метода, каждой итерации не новый объект приходит?
public IEnumerable<object[]> data ()
    {
        var d = CreateData(1000);
        yield return new object[] { 1000,d.obj};
    }
      
      [Benchmark]
      [ArgumentsSource(nameof(dataN))]
      public int fun(int n,obj o){
           //что за объект "o"  будет приходить?
          // для каждого запуска fun() это новый объект?
          //... что-то по типу 
                  o.counter++;
          // если так не сделать в тесте, то некорректно работает.  А это вообще как объяснить. 
           o.Reset(); // o.counter=0;
         return 1; 
// объект o все ~деконстуктился, или он в другой  метод пошел, или в этот метод следующею итерацию?
  }   public int fun2(int n,obj o){}
  class obj{
            int counter; // статических полей нету
 }
  • Вопрос задан
  • 42 просмотра
Пригласить эксперта
Ответы на вопрос 1
AshBlade
@AshBlade Куратор тега C#
Просто хочу быть счастливым
Разве для каждого метода, каждой итерации не новый объект приходит?

Судя по исходному коду (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) и другие виды тестирования
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы