Verbesserungen der Performance bei ASP.NET Core

Der Dotnet-Doktor  –  1 Kommentare

ASP.NET Core MVC und ASP.NET Core WebAPI sind 12 bis 24 Prozent performanter als ihre ASP.NET-Vorgänger, wie meine Messungen zeigen.

Microsoft ist mit seiner Core-Produktfamilie (.NET Core, ASP.NET Core, Entity Framework Core) angetreten, nicht nur plattformunabhängig, modular und agil zu werden, sondern auch performanter im Vergleich zu den Vorgängern .NET Framework, ASP.NET und ADO.NET Entity Framework).

Letzte Woche verkündete Microsoft, dass man bei der Suchmaschine Bing unter Einsatz von .NET Core 2.1 einen Leistungszuwachs von 34 Prozent sowohl gegenüber dem klassischen .NET Framework als auch .NET Core 2.0 erzielen konnte. Der Grund für den Zuwachs liegt insbesondere in der Verbesserungen von Zeichenkettenoperationen in .NET Core 2.1, zum Beispiel bei String.Equals() und String.IndexOf(). Diese Verbesserungen wiederum basieren auf der Einführung der Typen Span<T> und Memory<T> in C# 7.2, die eine effizientere Navigation in Speicherblöcken ermöglichen (vgl. "C# – Informationen zu Span: Eine neue tragende Säule in .NET" im MSDN-Magazin).

Es stellt sich die Frage, ob man nur dann einen Vorteil von .NET Core und ASP.NET Core hat, wenn man so viele Zeichenkettenoperationen benötigt wie eine Suchmaschine. Ich habe die Leistung von ASP.NET Core MVC mit dem klassischen ASP.NET MVC und die Leistung von ASP.NET Core WebAPI mit der klassischen ASP.NET WebAPI verglichen. Dabei werden hier nur statische Texte aus dem Hauptspeicher des Webservers ausgeliefert. Es gibt also bei den folgenden Messwerten keinen Einfluss von anderen Operationen wie Dateisystemzugriffen, Datenbankzugriffen oder Zeichenkettenoperationen. Durch den Einsatz von Entity Framework Core statt Entity Framework kommt es zu weiteren Leistungsgewinnen, siehe dazu mein Beitrag von 2016. Ich werde bald aktuellere Daten für EF Core 2.1 veröffentlichen.

Das Ergebnis sieht man in nachstehender Grafik. Gemessen wurden sowohl der MVC-Fall als auch der WebAPI-Fall mit einmal 50 und einmal 500 Objekten ("Datensätzen" im RAM). Für valide Ergebnisse wurde der Durchschnitt von 100 Versuchen ermittelt.

Das Ergebnis ist in allen vier Fällen gleich: Das klassische ASP.NET ist am langsamsten, danach folgt ASP.NET Core 2.0. Am schnellsten ist ASP.NET Core 2.1, marginal schneller als Version 2.0. Bei 50 Datensätzen sind die Unterschiede gering. Bei 500 gewinnt man aber allein durch den Umstieg auf das neuere Webframework einige Leistung. Bei ASP.NET Core 2.1 WebAPI sind es 12,5, bei ASP.NET Core MVC 24,4 Prozent (jeweils verglichen mit den klassischen Pendants).

Dass ASP.NET Core performanter und gut im Vergleich zu anderen Webframeworks liegt, zeigt auch die TechEmpower-Benchmark Nummer 16 vom Juni 2018. Hier findet man ASP.NET Core inklusive Datenbankzugriff mit ADO.NET DataReader auf Platz 7. Mit Einsatz des Micro-ORM Dapper auf Platz 17 und bei Einsatz von Entity Framework Core auf Platz 36 (In der Tabelle steht "EF", tatsächlich kommt aber "EF Core" zum Einsatz, siehe Quellcode von TechEmpower). Datenbank ist dabei jeweils PostgreSQL. Platz 33 belegt ASP.NET Core mit DataReader und MySQL. Messungen für Microsoft SQL Server gibt es nicht. Dies ist in der Diskussion.

(Bild: https://www.techempower.com/benchmarks/#section=data-r16)