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
Выделено
Как вы можете видеть, некоторые методы работают быстрее, другие медленнее. «Освободить». Кроме того, видя все улучшения, внесенные в .Net 9, я ожидал, что он будет НАМНОГО быстрее, чем 8, но, опять же, результаты очень похожи.
Вопрос
Почему нет значительного выигрыша в производительности в «Release» и .Net 9?
Я подумал, что, возможно, это связано с тем, что я не делаю ничего другого, кроме как использовать встроенные методы расширения строк, которые могут быть максимально оптимизированы. да, но я не уверен.
И даже если это так, метод «Подстрока» должен иметь место для улучшения в «Выпуске» и .Net 9.
Настройка У меня есть следующий проект: IvanStoychev.Useful.String.Extensions Это просто набор вспомогательных методов для строк. Например: [code]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; } [/code] Класс 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, поэтому я ожидаю, что поведение по умолчанию для конфигурации «Выпуск» будет более оптимизированным, чем для «Отладки». Однако результаты не такие. Я использую следующий код тестера: [code]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"); } } [/code] Результаты 8-DBG
Метод Среднее Ошибка StdDev Медиана Поколение 0 Поколение 1 Выделено
Как вы можете видеть, некоторые методы работают быстрее, другие медленнее. «Освободить». Кроме того, видя все улучшения, внесенные в .Net 9, я ожидал, что он будет НАМНОГО быстрее, чем 8, но, опять же, результаты очень похожи. Вопрос Почему нет значительного выигрыша в производительности в «Release» и .Net 9? Я подумал, что, возможно, это связано с тем, что я не делаю ничего другого, кроме как использовать встроенные методы расширения строк, которые могут быть максимально оптимизированы. да, но я не уверен. И даже если это так, метод «Подстрока» должен иметь место для улучшения в «Выпуске» и .Net 9.