Re: dotnetBenchmark как готовить
От: Sinclair Россия https://github.com/evilguest/
Дата: 07.07.20 15:34
Оценка:
Здравствуйте, okon, Вы писали:

O>Хотелось померять скорость вставки строки в разных сценариях с обычной строкой, билдер без выделенного заранее буффера и билдер с буффером.

O>Если не настраивать параметры теста, то по умолчанию он начинает длинные танцы с бубном, я так и не дождался результата за 5 минут и не понятно когда ждать завершения — прервал.

Не очень понятно, что именно вы хотите измерить.
BDN предполагает, что замеряемая операция воспроизводима.

Т.е. что-то типа "берём пустой stringbuilder и вставляем в него 100 символов по одному", сравниваем с "берём stringbuilder с capacity=100 и вставляем в него 100 символов по одному".

То, что у вас написано — это стрингбилдер инициализируется 1 раз, затем в него охулиард раз вставляется 1 символ.
Понятно, что перформанс этой вставки зависит не от подробностей инициализации, а от посторонних вещей — типа пришлось ли сделать GC при перевыделении буфера во время именно этой вставки.
Я бы писал примерно так:
public class BenchmarkTest
{
  [Param(1000)]
  public int InsertCount{get;set;}
  [Param(10)]
  public int RepeatCount{get;set;}
  [Param("1234567890")]
  public string BaseString{get;set;}

  [Benchmark]
  public void InsertStr()
  {
    var str = GetString();
    for(var i = 0; i<InsertCount; i++)
      str = str.Insert(4, "5");
  }

  [Benchmark]
  public void InsertStringBuilder()
  {
    stringBuilder = new StringBuilder(GetString());
    for(var i=0; i<InsertCount; i++)
      stringBuilder.Insert(4, "5");
  }

  [Benchmark]
  public void InsertStringBuilderWithCapacity()
  {
    var stringBuilderWithCapacity = new StringBuilder(BaseStr.Length * RepeatCount + InsertCount);
    stringBuilderWithCapacity.Append(GetString());
    for(var i=0; i<InsertCount; i++)
      stringBuilderWithCapacity.Insert(4, "5");
  }
  [Benchmark]
  public void Empty()
  {
  }
  private string GetString()=> string.Join(string.Empty, Enumerable.Repeat(BaseStr, RepeatCount));
}
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.