Start Debugging

performance

82 Beiträge · Seite1von9

ref-T-Schleife vs. Span<T>-Indizierung in C#: warum die Span-Variante in .NET 10 gleich schnell oder schneller ist

In .NET 10 wird eine einfache for-Schleife über span[i], begrenzt durch span.Length, zu einer Schleife ohne Bounds Check, mit Strength Reduction und abwärts zählendem Zähler kompiliert. Eine handgeschriebene Unsafe.Add(ref r, i)-Schleife mit int-Index behält eine Vorzeichenerweiterung und einen aufwärts zählenden Vergleich und war in der Messung 2 bis 5 % langsamer. Benchmarks und JIT-Disassembly für arm64 und x64 auf .NET 10.0.10.

Zwei Collections in C# im Gleichschritt durchlaufen, ohne Heap-Allokationen

Enumerable.Zip allokiert 144 bis 208 Bytes pro Aufruf und läuft etwa 10x langsamer als eine einfache Schleife. Für Arrays und Listen ist eine for-Schleife über zwei auf dieselbe Länge zugeschnittene Spans allokationsfrei und die schnellste Variante; wer foreach-Syntax möchte, kommt mit einem kleinen ref struct Zip-Enumerator auf weniger als 25 % Abstand. Gemessen mit .NET 10.0.10 und .NET 11 RC 3.

Lazy<T> vs LazyInitializer.EnsureInitialized vs Double-Checked Locking in C#

Verwenden Sie standardmäßig Lazy<T>: Es führt die Factory genau einmal aus, speichert Ausnahmen zwischen, und seine Lesezugriffe sind nach der Initialisierung zu billig, um messbar zu sein. Nutzen Sie LazyInitializer.EnsureInitialized, wenn Sie viele Felder oder Array-Elemente lazy befüllen und sich ein zusätzliches Objekt pro Wert nicht leisten können. Handgeschriebenes Double-Checked Locking lohnt sich unter .NET 10 fast nie.

Was ist Transparent Struct Layout, und warum ändert ein Wrapper-Struct mit einem einzigen Feld die Aufrufkonvention in .NET?

Ein transparentes Struct wird von der ABI exakt wie sein einziges Feld behandelt. .NET 11 bietet diese Garantie nicht: Ein Struct, das ein double kapselt, wird unter Windows x64 in RCX übergeben, unter Linux und macOS aber in XMM0. Hier sind das Disassembly des .NET-11-JIT für drei ABIs, die daraus entstehenden P/Invoke-Fehler und wie Sie Wrapper-Typen schreiben, die an jeder Grenze sicher sind.
Weiter