Почему мои результаты тестов в Release не быстрее, чем в Debug?C#

Место общения программистов C#
Ответить
Anonymous
 Почему мои результаты тестов в Release не быстрее, чем в Debug?

Сообщение Anonymous »

Настройка
У меня есть следующий проект: IvanStoychev.Useful.String.Extensions
Это просто набор вспомогательных методов для строк.
Например:

Код: Выделить всё

public static bool ContainsAny(this string str, IEnumerable keywords, StringComparison comparison = StringComparison.Ordinal)
{
Validate.OriginalInstanceNotNull(str);
Validate.NotNull(keywords);
Validate.IEnumNotEmpty(keywords);
Validate.EnumContainsValue(comparison);

foreach (var word in keywords)
{
Validate.NotNullMember(word, nameof(keywords));
if (str.Contains(word, comparison))
return true;
}

return false;
}
Класс Validate просто выполняет проверки и выдает исключение, если они не выполняются. Кроме того, это всего лишь foreach с использованием исходного метода "Contains".
Цель
Я хотел протестировать свою библиотеку в конфигурации Debug и Release и в .Net 8 и .Net 9, ожидая, что результаты будут лучше в Release и в .Net 9.
Сравнительный анализ
Я добавляю net8-DBG в имя/версию моей библиотеки, и я компилирую ее с помощью команды dotnet package -c Release -o out, заменяя «Release» на «Debug» и копируя выходной файл пакета из каталога «out» в другой локальный каталог, и я указываю свой проект Benchmarker на этот каталог как его единственный источник nuget и устанавливаю/обновляю версию пакета в проекте Benchmarker. Я делаю это один раз для .Net 8, а затем меняю версию в файле csproj проекта библиотеки на .Net 9 и повторяю (меняя «net8» на «net9» в имени/версии).
Я не указал свойство в моем csproj, поэтому я ожидаю, что поведение по умолчанию для конфигурации «Выпуск» будет более оптимизированным, чем для «Отладки». Однако результаты не такие.
Я использую следующий код тестера:

Код: Выделить всё

class Program
{
static void Main(string[] args)
{
//var summary = BenchmarkRunner.Run(ManualConfig.Create(DefaultConfig.Instance).WithOptions(ConfigOptions.DisableOptimizationsValidator));  --- I use this one for Debug versions
var summary = BenchmarkRunner.Run();
}
}

[MemoryDiagnoser]
public class Benchmarker
{
const string constantStr = "";

[Benchmark]
public void Remove()
{
constantStr.Remove("a");
}

[Benchmark]
public void Replace()
{
constantStr.Replace("a", "e");
}

[Benchmark]
public void Substring()
{
constantStr.Substring("user", "Library");
}

[Benchmark]
public void ContainsAny()
{
constantStr.ContainsAny(["zwarghsgorp"]);
}

[Benchmark]
public void Trim()
{
constantStr.Trim("DescriptionI");
}
}
Результаты
8-DBG



Метод
Среднее
Ошибка
StdDev
Медиана
Поколение 0
Поколение 1
Выделено




Удалить
6494,7 нс
44,50 нс
39,45 нс
6496,8 нс
0,5417
-
4536 Б


Заменить
206,5 нс
4,14 нс
8,65 нс
201,6 нс
0,5691
-
4760 Б


Подстрока
1252,9 нс
25,11 нс
58,69 нс
1231,3 нс
0,7019
-
5888 Б


Содержит Любой
176,3 нс
0,76 нс
0,63 нс
176,1 нс
0,0095
-
80 Б


Обрезка
377,8 нс
7,18 нс
7,05 нс
378,3 нс
0,5746
0,0100
4808 Б



8-RLS



Метод
Среднее
Ошибка
StdDev
Gen0
Gen1
Выделено




Удалить
6344,7 нс
20,10 нс
16,79 нс
0,5417
-
4536 Б


Replace
214,4 нс
4,21 нс
4,14 нс
0,5691
-
4760 Б


Подстрока
1168,3 нс
17,14 нс
16,03 нс
0,7019
-
5888 B


Содержит Любой
206,9 нс
1,72 нс
1,53 нс
0,0095
-
80 Б


Обрезка
315,2 нс
5,82 нс
5,16 нс
0.5746
0.0100
4808 B



9-DBG



Метод
Среднее
Ошибка
StdDev
Медиана
Gen0
Gen1
Выделено




Удалить
6507,8 нс
59,81 нс
55,95 нс
6507,8 нс
0.5417
-
4536 B


Replace
208,2 нс
4,21 нс
9,32 нс
202,1 нс
0,5691
-
4760 Б


Подстрока
1229,1 нс
5,49 нс
4,59 нс
1228,1 нс
0,7019
-
5888 Б


Содержит Любой
172,6 нс
3,26 нс
3,04 нс
171,4 нс
0,0095
-
80 Б


Обрезка
379,9 нс
7,29 нс
7,48 нс
380,7 нс
0.5746
0.0100
4808 B



9-RLS



Метод
Среднее
Ошибка
StdDev
Медиана
Поколение 0
Поколение 1
Выделено




Удалить
6655,3 нс
132,70 нс
136,27 нс
6656,5 нс
0,5417
-
4536 Б


Replace
211,2 нс
4,25 нс
9,15 нс
211,1 нс
0,5691
-
4760 Б


Подстрока
1155,1 нс
21,20 нс
41,35 нс
1133,6 нс
0,7019
-
5888 Б


СодержитЛюбой
208,3 нс
0,72 нс
0,60 нс
208,4 нс
0,0095
-
80 Б


Обрезка
312,8 нс
6,11 нс
6,00 нс
313,4 нс
0.5746
0.0100
4808 B



Как вы можете видеть, некоторые методы работают быстрее, другие медленнее. «Освободить». Кроме того, видя все улучшения, внесенные в .Net 9, я ожидал, что он будет НАМНОГО быстрее, чем 8, но, опять же, результаты очень похожи.
Вопрос
Почему нет значительного выигрыша в производительности в «Release» и .Net 9?
Я подумал, что, возможно, это связано с тем, что я не делаю ничего другого, кроме как использовать встроенные методы расширения строк, которые могут быть максимально оптимизированы. да, но я не уверен.
И даже если это так, метод «Подстрока» должен иметь место для улучшения в «Выпуске» и .Net 9.

Подробнее здесь: https://stackoverflow.com/questions/798 ... d-to-debug
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»