Здравствуйте, 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));
}