
Maui Performance
- 99 installs
- 163 repo stars
- Updated July 6, 2026
- davidortinau/maui-skills
Optimizes .NET MAUI app performance covering profiling, compiled bindings, layout efficiency, image optimization, startup time, trimming, and NativeAOT.
About
Provides performance optimization guidance for .NET MAUI apps including profiling, compiled bindings, layout efficiency, image optimization, startup time, trimming and NativeAOT. A developer uses it when improving speed and startup of a MAUI app.
- Profiling, compiled bindings, and layout efficiency
- Startup time, trimming, and NativeAOT configuration
Maui Performance by the numbers
- 99 all-time installs (skills.sh)
- Ranked #561 of 1,039 Mobile Development skills by installs in the Skillselion catalog
- Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/davidortinau/maui-skills --skill maui-performanceAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 99 |
|---|---|
| repo stars | ★ 163 |
| Last updated | July 6, 2026 |
| Repository | davidortinau/maui-skills ↗ |
What it does
Optimizes .NET MAUI app performance covering profiling, compiled bindings, layout efficiency, image optimization, startup time, trimming, and NativeAOT.
Files
.NET MAUI Performance Optimization
Profiling
- dotnet-trace: Cross-platform profiler for all MAUI targets. Collect traces with:
dotnet-trace collect --process-id <PID> --providers Microsoft-DotNETCore-SampleProfiler- PerfView (Windows only): Use for deep allocation and CPU analysis on WinUI targets.
- Profile before optimizing — measure, don't guess.
Compiled Bindings
- Always set
x:DataTypeon pages/views to enable compiled bindings. - Compiled bindings are 8–20× faster than reflection-based bindings.
- Required for NativeAOT and full trimming — reflection bindings break under trimming.
- Apply
x:DataTypeat the highest reasonable scope (page or root element).
<ContentPage xmlns:vm="clr-namespace:MyApp.ViewModels"
x:DataType="vm:MainViewModel">
<Label Text="{Binding Title}" />
</ContentPage>- For
DataTemplateinsideCollectionView/ListView, setx:DataTypeon the template root:
<DataTemplate x:DataType="model:Item">
<Label Text="{Binding Name}" />
</DataTemplate>- Minimize unnecessary bindings: Static content that never changes doesn't need
{Binding}. Use literal values orx:Staticinstead.
Layout Optimization
- Avoid nested single-child layouts — a
StackLayoutwith one child is pointless overhead. - Prefer `Grid` over nested `StackLayout`/`VerticalStackLayout` — Grid resolves layout in a single pass.
- Use
IsVisible="False"to hide elements rather than adding/removing from the tree at runtime. - Remove unnecessary wrapper containers — every layout adds a measure/arrange pass.
- Avoid `AbsoluteLayout` when
Gridwith row/column definitions achieves the same result. - Set explicit
WidthRequest/HeightRequestwhere sizes are known to reduce measure passes.
CollectionView and ListView
- Use
ItemSizingStrategy="MeasureFirstItem"onCollectionViewwhen items have uniform height — avoids measuring every item individually.
<CollectionView ItemSizingStrategy="MeasureFirstItem"
ItemsSource="{Binding Items}">- Prefer
CollectionViewoverListViewfor new development. - Keep
DataTemplatevisual trees shallow — fewer nested layouts per item.
Image Optimization
- Size images to display resolution — don't load a 4000×3000 image for a 200×200 display.
- Use
Aspect="AspectFill"orAspectFitand set explicit dimensions. - Cache downloaded images:
CachingEnabled="True"(default) onUriImageSource, setCacheValidity. - Use platform-appropriate formats (WebP for Android, HEIF/PNG for iOS).
- For icons and simple graphics, prefer SVG or vector-based font icons.
Resource Dictionaries
- App-level (
App.xaml): Shared styles, colors, converters used across multiple pages. - Page-level: Styles/resources specific to a single page — keeps App.xaml lean.
- Avoid duplicating resources across dictionaries.
- Use
MergedDictionariesto organize large resource sets without bloating a single file.
Startup Optimization
- Minimize work in
Appconstructor andMainPageconstructor. - Defer non-essential service registration — use lazy initialization where possible.
- Reduce the number of XAML pages parsed at startup (use
Shellrouting for deferred loading). - Remove unused
Handlers/Effectsregistrations fromMauiProgram.cs. - On Android, ensure
AndroidManifest.xmldoesn't force unnecessary permissions checks at launch.
Trimming
Enable IL trimming to reduce app size and remove unused code:
<PropertyGroup>
<PublishTrimmed>true</PublishTrimmed>
<TrimMode>full</TrimMode>
</PropertyGroup>- Test thoroughly — trimming can remove code accessed only via reflection.
- Use
[DynamicDependency]or[UnconditionalSuppressMessage]to preserve reflection targets. - Compiled bindings are essential — reflection-based bindings will be trimmed away.
NativeAOT
- NativeAOT compiles to native code ahead-of-time for faster startup and smaller footprint.
- Requirements: compiled bindings, no unconstrained reflection, trimming-compatible code.
<PropertyGroup>
<PublishAot>true</PublishAot>
<PublishTrimmed>true</PublishTrimmed>
</PropertyGroup>- Audit third-party NuGet packages for trimming/AOT compatibility.
- Use
[JsonSerializable]source generators instead of reflection-based JSON serialization. - Run
dotnet publishwith AOT to verify no warnings before shipping.
Quick Checklist
1. ✅ x:DataType on all pages, templates, and data-bound views 2. ✅ No nested single-child layouts 3. ✅ Grid preferred over nested StackLayouts 4. ✅ Images sized to display, caching enabled 5. ✅ ItemSizingStrategy="MeasureFirstItem" on uniform CollectionViews 6. ✅ Startup work minimized and deferred 7. ✅ Trimming enabled and tested 8. ✅ Profile with dotnet-trace before and after changes