Ich habe das folgende Projekt: IvanStoychev.Useful.String.Extensions
Es sind nur ein paar String-Hilfsmethoden.
Zum Beispiel:
Code: Select all
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;
}
Ziel
Ich wollte meine Bibliothek in der Debug- vs. Release-Konfiguration und in .Net 8 vs. .Net 9 vergleichen und erwarte, dass die Ergebnisse in Release und in .Net 9 besser sind.
Benchmarking
Ich füge hinzu net8-DBG auf den Namen/die Version meiner Bibliothek und ich kompiliere es mit dem Befehl dotnet pack -c Release -o out, ersetze „Release“ durch „Debug“ und kopiere die Ausgabepaketdatei aus dem „out“-Verzeichnis in ein anderes lokales Verzeichnis und verweise mein Benchmarker-Projekt auf dieses Verzeichnis als einzige Nuget-Quelle und installiere/aktualisiere die Paketversion im Benchmarker-Projekt. Ich mache das einmal für .Net 8 und ändere dann die -Version in der CSPROJ-Datei des Bibliotheksprojekts in .Net 9 und wiederhole es (und ändere „net8“ in „net9“ im Namen/in der Version).
Ich habe die -Eigenschaft in meinem CSPROJ nicht angegeben, daher würde ich erwarten, dass das Standardverhalten der „Release“-Konfiguration optimierter ist als das „Debug“-Konfiguration. Doch die Ergebnisse sind nicht so.
Ich verwende den folgenden Benchmarker-Code:
Code: Select all
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
Methode
Mittelwert
Fehler
StdDev
Median
Gen0
Gen1
Zugewiesen
Entfernen
6.494,7 ns
44,50 ns
39,45 ns
6.496,8 ns
0,5417
-
4536 B
Ersetzen
206,5 ns
4,14 ns
8,65 ns
201,6 ns
0,5691
-
4760 B
Substring
1.252,9 ns
25,11 ns
58,69 ns
1.231,3 ns
0,7019
0,60 ns
208,4 ns
0,0095
-
80 B
Trim
312,8 ns
6,11 ns
6,00 ns
313,4 ns
0,5746
0,0100
4808 B
Wie Sie unter „Release“ sehen können, sind einige Methoden schneller, andere langsamer. Angesichts all der Verbesserungen, die in .Net 9 vorgenommen wurden, erwartete ich außerdem, dass es VIEL schneller als 8 sein würde, aber auch hier sind die Ergebnisse sehr ähnlich.
Frage
Warum gibt es unter „Release“ und .Net 9 keinen signifikanten Leistungsvorteil?
Ich dachte, es könnte vielleicht daran liegen, dass ich nicht viel anderes mache als Foreaching über integrierte String-Erweiterungsmethoden, die möglicherweise genauso optimiert sind Wie es sein kann, bin mir aber nicht sicher.
Und selbst wenn das der Fall ist, sollte die Methode „Substring“ unter „Release“ und .Net 9 Raum für Verbesserungen haben.
Mobile version