Introduktion: Varför prestanda är viktigare än någonsin
Mobilanvändare har noll tålamod. Ärligt talat, studier visar att om en app tar mer än tre sekunder att starta så överger hälften av användarna den — för gott. Varje millisekund räknas, och det är precis därför .NET MAUI 10 har lagt så enormt fokus på just prestanda.
Den kanske mest omvälvande förändringen? Native AOT-stöd som nu mognat rejält, med experimentellt stöd även för Android.
I den här guiden går vi igenom allt du behöver veta om prestandaoptimering i .NET MAUI 10. Vi börjar med Native AOT — vad det är, hur det fungerar, och hur du konfigurerar det — och sedan fortsätter vi med trimning, kompilerade bindningar, den nya XAML-källgeneratorn, diagnostikverktyg och en rad praktiska optimeringstekniker du kan börja använda redan idag. Så, låt oss dyka in.
Artikeln riktar sig till .NET MAUI-utvecklare som vill pressa ut maximalt med prestanda ur sina appar. Vi förutsätter att du har grundläggande erfarenhet av .NET MAUI och C#.
Vad är Native AOT och varför spelar det roll?
Native AOT står för Native Ahead-of-Time compilation. Till skillnad från den traditionella JIT-kompileringen (Just-in-Time), där IL-kod översätts till maskinkod vid körning, kompilerar Native AOT hela din applikation till plattformsspecifik maskinkod redan vid byggtillfället. Ingen JIT-fas, ingen uppstartstid bortkastad på kompilering.
Resultatet är, ärligt talat, ganska dramatiskt:
- Upp till 2x snabbare uppstartstid på iOS jämfört med Mono-distributionsmodellen
- Mer än 2x mindre appstorlek för både iOS och Mac Catalyst
- Upp till 2,8x snabbare byggtider på iOS jämfört med standardmodellen
- Betydligt lägre minnesförbrukning — Native AOT-binärer kan använda 40–60% mindre RAM
Dessa siffror kommer direkt från Microsofts egna benchmarks för en dotnet new maui-app. I praktiken varierar resultaten beroende på appens komplexitet, men trenden är tydlig: Native AOT ger rejäla prestandavinster.
Native AOT i .NET 10: Vad är nytt?
I .NET 9 introducerades Native AOT-stöd för iOS och Mac Catalyst. I .NET 10 har stödet mognat ytterligare, och den stora nyheten är experimentellt Native AOT-stöd för Android.
Tidiga tester visar riktigt imponerande resultat: uppstartstiden på Android sjönk från 1270–1410 ms med MonoAOT ner till 271–331 ms med Native AOT. Det är en förbättring på runt 4x — inte illa alls.
Microsoft har dock varit tydliga med att Android-stödet inte är produktionsfärdigt ännu. Deras rekommendation är att utforska och testa, men vänta till .NET 11 innan du använder det i produktion. Rimligt, om du frågar mig.
Konfigurera Native AOT för iOS och Mac Catalyst
Okej, låt oss gå igenom den praktiska konfigurationen steg för steg. Vi börjar med de plattformar där Native AOT redan har produktionsstöd: iOS och Mac Catalyst.
Steg 1: Aktivera AOT-analysatorer
Börja med att markera ditt projekt som AOT-kompatibelt. Det aktiverar trimnings- och AOT-analysatorer som hjälper dig identifiera problematisk kod:
<PropertyGroup>
<!-- Aktivera trimnings- och AOT-analysatorer på alla plattformar -->
<IsAotCompatible>true</IsAotCompatible>
<!-- Aktivera Native AOT för iOS och Mac Catalyst -->
<PublishAot Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">true</PublishAot>
<PublishAot Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">true</PublishAot>
</PropertyGroup>
Viktigt: Villkora inte PublishAot på byggkonfiguration (Debug/Release). Trimmningsfunktioner aktiveras baserat på detta värde, och samma funktioner bör vara aktiverade i alla konfigurationer för konsekvent beteende. Det här är en sån där grej man lätt missar.
Steg 2: Publicera med Native AOT
Native AOT aktiveras vid publicering, inte vid vanlig build. Det gör att du kan fortsätta utveckla som vanligt och bara behöver tänka på AOT vid publicering. Använd följande kommandon:
# iOS
dotnet publish -f net10.0-ios -r ios-arm64
# Mac Catalyst (ARM)
dotnet publish -f net10.0-maccatalyst -r maccatalyst-arm64
# Mac Catalyst (Intel)
dotnet publish -f net10.0-maccatalyst -r maccatalyst-x64
# Universell Mac Catalyst-app
dotnet publish -f net10.0-maccatalyst
Under publiceringen analyserar kompilatorn hela din kodbas och alla beroenden. Om den hittar kod som inte är trimnings- eller AOT-kompatibel genereras varningar. En enda varning innebär att appen potentiellt inte är kompatibel — så ignorera dem inte.
Steg 3: Testa experimentellt Android-stöd
Nyfiken på att prova Native AOT på Android? I .NET 10 kan du byta till CoreCLR-runtime istället för Mono:
<PropertyGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">
<UseMonoRuntime>false</UseMonoRuntime>
</PropertyGroup>
Observera att detta är experimentellt. Appstorleken kan bli större än med Mono, och felsökning samt runtime-diagnostik är inte helt funktionellt ännu. Men det ger dig möjligheten att börja utvärdera redan nu (och ärligt talat, de tidiga prestandasiffrorna är spännande).
Anpassa din app till Native AOT-krav
Native AOT ställer strikta krav på din kod. Kompilatorn utför aggressiv trimning och statisk analys, vilket innebär att dynamisk kod — reflektion, runtime XAML-parsning och liknande — helt enkelt inte fungerar. Här är en checklista för att göra din app AOT-redo.
Kompilerad XAML är ett krav
All XAML måste kompileras vid byggtillfället. Ta bort alla instanser av:
// Ta bort detta:
[XamlCompilation(XamlCompilationOptions.Skip)]
// Och detta i XAML-filer:
<?xaml-comp compile="false" ?>
Alla anrop till LoadFromXaml() måste också bort, eftersom runtime XAML-parsning inte är möjligt med Native AOT. Punkt.
Kompilerade bindningar överallt
Alla databindningar måste vara kompilerade. Det innebär att alla XAML-bindningar behöver x:DataType-annoteringar, och alla kodbindningar måste använda lambda-uttryck istället för strängbaserade bindningar.
<!-- Rätt: kompilerad bindning med x:DataType -->
<ContentPage x:DataType="viewmodels:MainViewModel">
<Label Text="{Binding UserName}" />
</ContentPage>
I C#-kod ser det ut så här:
// Fel: strängbaserad bindning
label.SetBinding(Label.TextProperty, "UserName");
// Rätt: lambda-baserad kompilerad bindning
label.SetBinding(Label.TextProperty, static (MainViewModel vm) => vm.UserName);
Skillnaden är inte jättestor syntaxmässigt, men prestandavinsten kan vara märkbar — speciellt i listor med hundratals element.
Ersätt OnPlatform och OnIdiom XAML-tillägg
XAML-tilläggen OnPlatform och OnIdiom fungerar inte med Native AOT. Du behöver ersätta dem med klasserna OnPlatform<T> respektive OnIdiom<T>:
<!-- Före (fungerar ej med Native AOT) -->
<Label FontSize="{OnPlatform iOS=16, Android=14}" />
<!-- Efter (Native AOT-kompatibelt) -->
<Label>
<Label.FontSize>
<OnPlatform x:TypeArguments="x:Double">
<On Platform="iOS" Value="16" />
<On Platform="Android" Value="14" />
</OnPlatform>
</Label.FontSize>
</Label>
Ja, det är mer verbose. Men det är priset man betalar för AOT-kompatibilitet.
Ersätt QueryPropertyAttribute med IQueryAttributable
QueryPropertyAttribute förlitar sig på reflektion och fungerar inte med Native AOT. Implementera istället IQueryAttributable:
// Före
[QueryProperty(nameof(ItemId), "id")]
public class DetailPage : ContentPage { ... }
// Efter
public class DetailPage : ContentPage, IQueryAttributable
{
public void ApplyQueryAttributes(IDictionary<string, object> query)
{
if (query.TryGetValue("id", out var id))
{
ItemId = id?.ToString();
}
}
}
Använd källgeneratorer för JSON och Regex
Native AOT kräver att JSON-serialisering och reguljära uttryck använder källgeneratorer. Det här kan kännas lite omständligt i början, men det blir snabbt en naturlig del av arbetsflödet:
// JSON-serialisering med källgenererad kontext
[JsonSerializable(typeof(WeatherForecast))]
[JsonSerializable(typeof(List<WeatherForecast>))]
public partial class AppJsonContext : JsonSerializerContext { }
// Användning
var data = JsonSerializer.Deserialize(json, AppJsonContext.Default.WeatherForecast);
// Regex med källgenerering
public partial class Validators
{
[GeneratedRegex(@"^[\w\.-]+@[\w\.-]+\.\w{2,}$")]
public static partial Regex EmailRegex();
}
XAML-källgeneratorn: Ny i .NET MAUI 10
Det här är en av mina favoriter bland nyheterna i .NET MAUI 10. Den nya XAML-källgeneratorn genererar starkt typad C#-kod vid kompileringstillfället istället för att tolka XAML vid körning. Resultatet? Snabbare uppstart, bättre verktygsintegration och mer pålitlig runtime-prestanda.
Aktivera källgeneratorn
Lägg till följande i din projektfil:
<PropertyGroup>
<MauiXamlInflator>SourceGen</MauiXamlInflator>
</PropertyGroup>
Genererade typer dekoreras med attributet [Generated] för bättre verktygsintegration och felsökningsstöd. Smidigt.
Globala XML-namnrymder
Tillsammans med källgeneratorn introducerar .NET 10 ett renare XML-namnrymdsystem. Istället för att deklarera xmlns:-rader i varje XAML-fil kan du skapa globala namnrymder:
// GlobalXmlns.cs
[assembly: XmlnsDefinition(
"http://schemas.microsoft.com/dotnet/maui/global",
"MinApp.Views")]
[assembly: XmlnsDefinition(
"http://schemas.microsoft.com/dotnet/maui/global",
"MinApp.Controls")]
[assembly: XmlnsDefinition(
"http://schemas.microsoft.com/dotnet/maui/global",
"MinApp.Converters")]
Med opt-in för implicita namnrymder kan din XAML bli dramatiskt renare:
<!-- Före (.NET 8-stil) -->
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:models="clr-namespace:MinApp.Models"
xmlns:controls="clr-namespace:MinApp.Controls"
x:Class="MinApp.MainPage">
<controls:TagView x:DataType="models:Tag" />
</ContentPage>
<!-- Efter (.NET 10 med opt-in) -->
<ContentPage x:Class="MinApp.MainPage">
<TagView x:DataType="Tag" />
</ContentPage>
Det kan verka som en liten detalj, men i stora projekt med hundratals XAML-filer minskar det mängden boilerplate avsevärt. Och ärligt talat, vem gillar boilerplate?
Trimning: Djupdykning i .NET 10
Trimning och Native AOT hänger tätt ihop, men trimning är viktig även utan AOT. I .NET MAUI 10 har trimningen förbättrats på flera fronter.
Trimmer aktiverad i fler konfigurationer
I .NET 10 är trimmern nu aktiverad som standard i följande konfigurationer:
- iOS Simulator/arm64 (alla konfigurationer)
- tvOS Simulator/arm64 (alla konfigurationer)
- Mac Catalyst/arm64 (alla konfigurationer)
Det här är en stor grej. Det innebär att du upptäcker trimningsproblem tidigare i utvecklingscykeln, inte bara vid publicering.
Trimmervarningar aktiverade som standard
Tidigare var trimmervarningar undertryckta på iOS eftersom basbiblioteket genererade varningar som utvecklare inte kunde åtgärda. I .NET 9 fixades alla dessa, och i .NET 10 är varningarna aktiverade som standard. Om du tillfälligt behöver stänga av dem:
<PropertyGroup>
<SuppressTrimAnalysisWarnings>true</SuppressTrimAnalysisWarnings>
</PropertyGroup>
Men undvik att göra detta permanent. Trimmervarningar finns där av en anledning — de pekar på kod som riskerar att sluta fungera i produktion.
AndroidStripILAfterAOT
På Android kan du aktivera IL-strippning efter AOT-kompilering för att ytterligare minska appstorleken:
<PropertyGroup>
<AndroidStripILAfterAOT>true</AndroidStripILAfterAOT>
</PropertyGroup>
Detta tar bort IL-koden som redan kompilerats till maskinkod. Enkelt och effektivt.
Ny diagnostikinfrastruktur för prestandaövervakning
.NET MAUI 10 introducerar ett helt nytt diagnostiksystem för att övervaka layoutprestanda i realtid. Det här är guld värt när du jagar prestandaflaskhalsar.
ActivitySource och Metrics
Det nya systemet bygger på System.Diagnostics och tillhandahåller detaljerad instrumentering:
- ActivitySource:
"Microsoft.Maui"— Spårar layoutoperationer med detaljerad timing - Metrics:
"Microsoft.Maui"— Registrerar räknare och histogram för prestandaanalys
Följande mätvärden är tillgängliga:
| Mätnamn | Typ | Beskrivning |
|---|---|---|
maui.layout.measure_count | Räknare | Antal mätningsoperationer |
maui.layout.measure_duration | Histogram | Tid för mätning (ns) |
maui.layout.arrange_count | Räknare | Antal arrangeringsoperationer |
maui.layout.arrange_duration | Histogram | Tid för arrangering (ns) |
Instrumenteringen använder struct-baserade mönster med using-satser för att undvika allokering — nolltillägg på prestanda när diagnostik inte aktivt samlas in. Snyggt designat.
Feature switch för AOT/trimning
Du kan styra diagnostikstödet vid kompileringstid med:
System.Diagnostics.Metrics.Meter.IsSupported
Det gör det möjligt att helt ta bort diagnostikinfrastruktur i produktionsbyggen om det inte behövs.
Android-specifika prestandaförbättringar i .NET 10
.NET MAUI 10 innehåller en rad Android-specifika förbättringar som direkt påverkar prestanda. Låt oss gå igenom dem.
Marshal methods aktiverade som standard
I .NET 9 introducerades ett nytt sätt att hantera de marshal-metoder som behövs när Java anropar C#-kod, vilket ger snabbare uppstartsprestanda. I .NET 10 är detta aktiverat som standard.
Om du upplever problem (vanligtvis en hängning vid start — sällan men kan hända) kan du tillfälligt inaktivera det:
<PropertyGroup>
<AndroidEnableMarshalMethods>false</AndroidEnableMarshalMethods>
</PropertyGroup>
Snabbare design-time builds
aapt2 anropas inte längre under design-time builds. Istället parsas .aar-filer och Android-resurser direkt. I Microsofts egna tester minskade design-time byggtiden från över 2 sekunder till under 600 ms. Det kanske inte låter som mycket, men när du bygger hundratals gånger om dagen känns det.
Snabbare APK-generering
Vid kommandoradskörning med dotnet build används nu System.IO.Compression.ZipArchive istället för det äldre android-libzipsharp för att skapa .aab- och .apk-filer. Resultat: snabbare byggtider.
Optimerad generator-output
Kodsökvägar som kan träffa System.Reflection.Emit har tagits bort från "Java-anropar-C#"-flödet. Det innebär snabbare uppstart och bättre övergripande prestanda.
Kontrollförbättringar som påverkar prestanda
.NET MAUI 10 inkluderar flera kontrolluppdateringar som direkt eller indirekt förbättrar prestanda. Här är det viktigaste.
CollectionView och CarouselView: Nya handlers som standard
I .NET 9 introducerades valfria nya handlers för CollectionView och CarouselView på iOS och Mac Catalyst, designade för bättre prestanda och stabilitet. I .NET 10 är de nu standard.
Det gamla ListView har också markerats som föråldrat. Dags att migrera till CollectionView om du inte redan gjort det:
<!-- Föråldrat -->
<ListView ItemsSource="{Binding Items}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Label Text="{Binding Name}" />
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<!-- Rekommenderat -->
<CollectionView ItemsSource="{Binding Items}">
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="models:Item">
<Label Text="{Binding Name}" />
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
Async-animeringsmetoder
De gamla animeringsmetoderna (FadeTo, ScaleTo, TranslateTo etc.) har markerats som föråldrade och ersatts med Async-varianter (FadeToAsync, ScaleToAsync, TranslateToAsync). Det gör async/await-mönstret tydligare och förhindrar vanliga misstag vid animeringshantering.
MessagingCenter borttaget
MessagingCenter har gjorts internt i .NET 10. Använd istället WeakReferenceMessenger från CommunityToolkit.Mvvm — det har bättre prestanda och minneshantering:
// Installera paketet
// dotnet add package CommunityToolkit.Mvvm
// Registrera meddelande
WeakReferenceMessenger.Default.Register<DataChangedMessage>(this, (r, m) =>
{
// Hantera meddelandet
});
// Skicka meddelande
WeakReferenceMessenger.Default.Send(new DataChangedMessage(newData));
SafeArea-förbättringar
.NET MAUI 10 introducerar ett förbättrat SafeArea-system med mer granulär kontroll. Det nya SafeAreaEdges-enumet ger dig finkornig styrning:
<!-- Kant-till-kant-innehåll (ingen safe area padding) -->
<ScrollView SafeAreaEdges="None">
<!-- Scrollbart innehåll utan hinder -->
</ScrollView>
<!-- Flöda under tangentbordet men respektera notch/bars -->
<ContentPage SafeAreaEdges="Container">
<!-- Sidans innehåll -->
</ContentPage>
<!-- Alltid respektera tangentbordet -->
<Grid SafeAreaEdges="SoftInput">
<Entry Placeholder="Skriv här..." />
</Grid>
Det här löser många av de irriterande layoutproblemen med tangentbord och notch som MAUI-utvecklare har kämpat med. Äntligen, kan man tycka.
Praktiska prestandatips och best practices
Utöver de nya funktionerna finns det flera beprövade tekniker för att optimera prestanda i .NET MAUI-appar. Här kommer mina rekommendationer.
1. Använd kompilerade bindningar konsekvent
Kompilerade bindningar undviker reflektionsbaserad bindningsupplösning och kan ge märkbart bättre prestanda, särskilt i listor med många element. Se till att alla bindningar har x:DataType:
<CollectionView ItemsSource="{Binding Products}" x:DataType="vm:ShopViewModel">
<CollectionView.ItemTemplate>
<DataTemplate x:DataType="models:Product">
<Grid Padding="10" ColumnDefinitions="80,*">
<Image Source="{Binding ImageUrl}" />
<VerticalStackLayout Grid.Column="1">
<Label Text="{Binding Name}" FontAttributes="Bold" />
<Label Text="{Binding Price, StringFormat='{0:C}'}" />
</VerticalStackLayout>
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
2. Optimera bilder
Bilder är ofta den största prestandaboven i mobilappar. I .NET MAUI 10 har MediaPicker fått stöd för storleksbegränsning, vilket är väldigt välkommet:
var result = await MediaPicker.PickMultipleAsync(new MediaPickerOptions
{
MaximumWidth = 1024,
MaximumHeight = 768
});
Övriga bildoptimeringstips:
- Använd lämpliga bildformat — WebP för Android och HEIF för iOS ger bättre komprimering
- Ladda bilder i rätt storlek från servern istället för att skala ned stora bilder lokalt
- Implementera bildcachning med exempelvis
FFImageLoadingeller liknande bibliotek - Använd
Aspect="AspectFill"istället förAspectFitnär det passar, för att undvika onödig layout-beräkning
3. Undvik onödiga layoutpass
Layoutberäkningar kan vara förvånansvärt dyra. Med det nya diagnostiksystemet i .NET MAUI 10 kan du mäta exakt hur mycket tid dina layouter tar. Här är vanliga misstag att undvika:
- Undvik djupt nästlade layouter — en
Gridmed rätt rader/kolumner presterar bättre än flera nästladeStackLayout - Använd
GridmedStar-storlek istället förAutodär det är möjligt - Sätt
IsVisible="false"istället förOpacity="0"— osynliga element hoppar över layoutberäkning helt - Undvik att binda
IsVisibletill komplexa uttryck som utvärderas ofta
4. Optimera startuppsekvensen
Appuppstart är kritisk för användarupplevelsen. Här är några strategier som gör skillnad:
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.ConfigureFonts(fonts =>
{
// Registrera bara de typsnitt du faktiskt använder
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
});
// Registrera tjänster som Transient om de inte behöver
// dela tillstånd — undvik onödig Singleton-overhead
builder.Services.AddTransient<MainPage>();
builder.Services.AddTransient<MainViewModel>();
// Använd Lazy-loading för tunga tjänster
builder.Services.AddSingleton<Lazy<DatabaseService>>(
sp => new Lazy<DatabaseService>(
() => sp.GetRequiredService<DatabaseService>()));
return builder.Build();
}
}
5. Profilera med dotnet-trace och dotnet-dsrouter
Gissa inte var prestandaproblemen sitter — mät. Använd Microsofts diagnostikverktyg för att profilera din app:
# Installera verktyg
dotnet tool install -g dotnet-trace
dotnet tool install -g dotnet-dsrouter
# Starta router för iOS/Android
dotnet-dsrouter client-server -tcps 127.0.0.1:9000
# Starta spårning
dotnet-trace collect --diagnostic-port 127.0.0.1:9000 \
--providers Microsoft-Maui
Det ger dig detaljerad insyn i exakt var din app spenderar tid, vilket är ovärderligt vid prestandaoptimering.
Begränsningar och saker att tänka på
Native AOT är kraftfullt, men det finns viktiga begränsningar att vara medveten om innan du kastar dig in:
- Tredjepartsbibliotek: Inte alla NuGet-paket är AOT-kompatibla. Du måste verifiera varje beroende — och det kan ta tid
- Reflektion: Begränsad — du kan inte använda dynamisk reflektion fritt
- Mono-interpreter: Inte kompatibel med Native AOT —
UseInterpreterochMtouchInterpreterignoreras - Felsökning: Hanterad debugger fungerar inte efter publicering — du måste använda
lldbför nativa binärer - Heap-analys: Stöds inte med Native AOT i dagsläget
- Android: Native AOT är experimentellt och inte produktionsfärdigt
Microsofts rekommendation är tydlig: utveckla, felsök och testa din app som vanligt med Mono. Publicera sedan med Native AOT som ett av de sista stegen innan release. Det är ett bra arbetsflöde.
Migrering steg för steg
Här är en sammanfattad plan för att migrera en befintlig .NET MAUI-app till Native AOT-kompatibilitet:
- Uppdatera till .NET 10 — Se till att du kör den senaste SDK:n
- Aktivera analysatorer — Sätt
IsAotCompatibletilltrue - Fixa alla trimmervarningar — Arbeta igenom varningarna metodiskt
- Migrera till kompilerade bindningar — Lägg till
x:DataTypeöverallt - Ersätt dynamisk kod — Byt ut
QueryPropertyAttribute,OnPlatform/OnIdiomXAML-tillägg, och strängbaserade bindningar - Använd källgeneratorer — För JSON, Regex, och aktivera XAML-källgeneratorn
- Testa med
dotnet publish— Publicera regelbundet för att fånga problem tidigt - Aktivera Native AOT — Sätt
PublishAottilltrueför målplattformarna - Utför grundliga tester — Verifiera att all funktionalitet fungerar korrekt
Ta det steg för steg. Försök inte göra allt på en gång — det brukar sluta med frustration.
Prestandajämförelse: Före och efter
Baserat på Microsofts dokumentation och community-benchmarks kan du förvänta dig följande typiska förbättringar med en helt optimerad .NET MAUI 10-app:
| Mätvärde | Före (Mono, .NET 9) | Efter (Native AOT, .NET 10) | Förbättring |
|---|---|---|---|
| Uppstartstid iOS | ~800 ms | ~400 ms | ~2x snabbare |
| Appstorlek iOS | ~30 MB | ~14 MB | ~2x mindre |
| Byggtid iOS | ~45 s | ~16 s | ~2,8x snabbare |
| Uppstartstid Android* | ~1300 ms | ~300 ms | ~4x snabbare |
* Android-siffror baserade på experimentella tester, ej produktionsfärdigt.
Sammanfattning
.NET MAUI 10 är ett stort steg framåt för prestanda i plattformsoberoende mobilutveckling. Med Native AOT som nu har produktionsstöd på iOS och Mac Catalyst, experimentellt stöd på Android, och en helt ny uppsättning verktyg för prestandaövervakning har det aldrig varit enklare att bygga snabba, lätta mobilappar med .NET.
De viktigaste åtgärderna du kan göra idag:
- Aktivera
IsAotCompatiblei ditt projekt och börja åtgärda varningar - Migrera alla bindningar till kompilerade bindningar
- Aktivera XAML-källgeneratorn
- Migrera från
ListViewtillCollectionView - Använd den nya diagnostikinfrastrukturen för att identifiera flaskhalsar
- Publicera regelbundet med
dotnet publishför att fånga problem tidigt
Prestanda är inte en engångsinsats — det är en kontinuerlig process. Men med verktygen och funktionerna som .NET MAUI 10 erbjuder har du allt du behöver för att leverera appar som faktiskt känns snabba och responsiva, oavsett plattform.