maui-performance
SKILL.md
.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
Gridover nestedStackLayout/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
AbsoluteLayoutwhenGridwith 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
- ✅
x:DataTypeon all pages, templates, and data-bound views - ✅ No nested single-child layouts
- ✅ Grid preferred over nested StackLayouts
- ✅ Images sized to display, caching enabled
- ✅
ItemSizingStrategy="MeasureFirstItem"on uniform CollectionViews - ✅ Startup work minimized and deferred
- ✅ Trimming enabled and tested
- ✅ Profile with dotnet-trace before and after changes
Weekly Installs
34
Repository
davidortinau/maui-skillsGitHub Stars
71
First Seen
Feb 16, 2026
Security Audits
Installed on
gemini-cli32
codex32
opencode32
amp31
github-copilot31
kimi-cli31