Информация об изменениях

Сообщение Re[2]: dotnetBenchmark как готовить от 07.07.2020 17:41

Изменено 07.07.2020 19:27 okon

Re[2]: dotnetBenchmark как готовить
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, okon, Вы писали:


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

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

S>Не очень понятно, что именно вы хотите измерить.

S>BDN предполагает, что замеряемая операция воспроизводима.

Хотелось задать строку определенной длины например 100 символов и посмотреть сколько будет стоить вставка строки в 1 символ.

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


S>То, что у вас написано — это стрингбилдер инициализируется 1 раз, затем в него охулиард раз вставляется 1 символ.

Во как, я просто привык что в тестах обычно на каждый вызов метод создается новый экземпляр.
Тут видимо иначе, в документации я нашел пример с конструктором, но там не уточняется как этот экземпляр используется.
https://benchmarkdotnet.org/articles/overview.html


S>Понятно, что перформанс этой вставки зависит не от подробностей инициализации, а от посторонних вещей — типа пришлось ли сделать GC при перевыделении буфера во время именно этой вставки.



S>Я бы писал примерно так:

S>[cs]

S> [Benchmark]

S> public void InsertStringBuilderWithCapacity()
S> {
S> var stringBuilderWithCapacity = new StringBuilder(BaseStr.Length * RepeatCount + InsertCount);
S> stringBuilderWithCapacity.Append(GetString());
S> for(var i=0; i<InsertCount; i++)
S> stringBuilderWithCapacity.Insert(4, "5");
S> }


Да но в этом случае тест получается не совсем корректный — тут мы измеряем не только вставку но и создание экземпляра StringBuilder и копирование в него строки.
А хочется замерить только вставку в уже проинициализированный. Можно конечно создать дополнительные методы без вставки и сравнить время, но это как временный вариант — не уверен что это правильный способ.
Re[2]: dotnetBenchmark как готовить
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, okon, Вы писали:


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

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

S>Не очень понятно, что именно вы хотите измерить.

S>BDN предполагает, что замеряемая операция воспроизводима.

Хотелось задать строку определенной длины например 100 символов и посмотреть сколько будет стоить вставка строки в 1 символ.

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


S>То, что у вас написано — это стрингбилдер инициализируется 1 раз, затем в него охулиард раз вставляется 1 символ.

Во как, я просто привык что в тестах обычно на каждый вызов метод создается новый экземпляр.
Тут видимо иначе, в документации я нашел пример с конструктором, но там не уточняется как этот экземпляр используется.
https://benchmarkdotnet.org/articles/overview.html

p.s. проверил экспериментально — да конструктор 1 раз вызывается на все замеры а не перед каждым замером, печально придется как-то обходить.


S>Понятно, что перформанс этой вставки зависит не от подробностей инициализации, а от посторонних вещей — типа пришлось ли сделать GC при перевыделении буфера во время именно этой вставки.



S>Я бы писал примерно так:

S>[cs]

S> [Benchmark]

S> public void InsertStringBuilderWithCapacity()
S> {
S> var stringBuilderWithCapacity = new StringBuilder(BaseStr.Length * RepeatCount + InsertCount);
S> stringBuilderWithCapacity.Append(GetString());
S> for(var i=0; i<InsertCount; i++)
S> stringBuilderWithCapacity.Insert(4, "5");
S> }


Да но в этом случае тест получается не совсем корректный — тут мы измеряем не только вставку но и создание экземпляра StringBuilder и копирование в него строки.
А хочется замерить только вставку в уже проинициализированный. Можно конечно создать дополнительные методы без вставки и сравнить время, но это как временный вариант — не уверен что это правильный способ.