All skills
davidortinau avatar

/maui-performance

@d061a64
by David Ortinaudavidortinau/maui-skills173 stars
20

Performance optimization guidance for .NET MAUI apps covering profiling, compiled bindings, layout efficiency, image optimization, resource dictionaries, startup time, trimming, and NativeAOT configuration. USE FOR: "performance optimization", "slow startup", "app performance", "compiled bindings", "layout optimization", "image optimization", "trimming", "NativeAOT", "profiling MAUI", "reduce app size", "startup time". DO NOT USE FOR: data binding syntax (use maui-data-binding), deprecated API migration (use maui-current-apis), or unit testing setup (use maui-unit-testing).

Use this Skill: https://skilld.dev/gh/davidortinau/maui-skills/maui-performance

This session only. Nothing lands on disk.

SKILL.md

โ‰ˆ150 tokens always: the name and description. โ‰ˆ1.2k when used: this file.

.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:DataType on 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:DataType at 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 DataTemplate inside CollectionView/ListView, set x:DataType on 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 or x:Static instead.

Layout Optimization

  • Avoid nested single-child layouts โ€” a StackLayout with 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 Grid with row/column definitions achieves the same result.
  • Set explicit WidthRequest/HeightRequest where sizes are known to reduce measure passes.

CollectionView and ListView

  • Use ItemSizingStrategy="MeasureFirstItem" on CollectionView when items have uniform height โ€” avoids measuring every item individually.
<CollectionView ItemSizingStrategy="MeasureFirstItem"
                ItemsSource="{Binding Items}">
  • Prefer CollectionView over ListView for new development.
  • Keep DataTemplate visual 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" or AspectFit and set explicit dimensions.
  • Cache downloaded images: CachingEnabled="True" (default) on UriImageSource, set CacheValidity.
  • 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 MergedDictionaries to organize large resource sets without bloating a single file.

Startup Optimization

  • Minimize work in App constructor and MainPage constructor.
  • Defer non-essential service registration โ€” use lazy initialization where possible.
  • Reduce the number of XAML pages parsed at startup (use Shell routing for deferred loading).
  • Remove unused Handlers/Effects registrations from MauiProgram.cs.
  • On Android, ensure AndroidManifest.xml doesn'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 publish with 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

Source: SKILL.md on GitHub

1 warning16d5 checks ยท Risk SAFE
  • Gen Agent Trust Hub16d

    The skill provides legitimate performance optimization guidance for .NET MAUI development. No malicious patterns, data exfiltration, or injection vulnerabilities were detected.

  • Socket16d

    No alerts

  • Snyk16d

    Risk: LOW ยท No issues

  • Runlayer7mo

    1/1 file flagged

  • ZeroLeaks5mo

    Score: 93/100 ยท 2 sections analyzed

Signed by skilld at d061a64. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub 2 months ago.

Steadyupdated 8 months ago

README badge

README badge for davidortinau/maui-skills/maui-performance