Skip to content

Commit

Permalink
[android] improve layout performance of Label (#14980)
Browse files Browse the repository at this point in the history
Context: #12130
Context: https://github.com/angelru/CvSlowJittering
Context: https://github.com/jonathanpeppers/lols

Testing a customer sample and my LOLs per second sample, I could see a
lot of time (5.1%) spent in `PrepareForTextViewArrange()`:

    1.01s (5.1%) microsoft.maui!Microsoft.Maui.ViewHandlerExtensions.PrepareForTextViewArrange(Microsoft.Maui.IViewHandler,Microsoft.Maui
    635.99ms (3.2%) mono.android!Android.Views.View.get_Context()

Most of the time is spent just calling `View.Context` to be able to do:

    internal static int MakeMeasureSpecExact(this Context context, double size)
    {
        // Convert to a native size to create the spec for measuring
        var deviceSize = (int)context!.ToPixels(size);
        return MeasureSpecMode.Exactly.MakeMeasureSpec(deviceSize);
    }

In eea91d3, I added an overload for `ToPixels()` that allows you to
get the same value with an `Android.Views.View` -- avoiding the need
to call `View.Context`.

So we can instead do:

    internal static int MakeMeasureSpecExact(this PlatformView view, double size)
    {
        // Convert to a native size to create the spec for measuring
        var deviceSize = (int)view.ToPixels(size);
        return MeasureSpecMode.Exactly.MakeMeasureSpec(deviceSize);
    }

After these changes, it seems to be ~2.7% better:

    420.68ms (2.4%) microsoft.maui!Microsoft.Maui.ViewHandlerExtensions.PrepareForTextViewArrange(Microsoft.Maui.IViewHandler,Microsoft.Maui

The `View.Context` call is now completely gone.
  • Loading branch information
jonathanpeppers authored May 8, 2023
1 parent 1d9c5cb commit bd1c013
Showing 1 changed file with 4 additions and 6 deletions.
10 changes: 4 additions & 6 deletions src/Core/src/Handlers/ViewHandlerExtensions.Android.cs
Original file line number Diff line number Diff line change
Expand Up @@ -143,9 +143,7 @@ internal static void PrepareForTextViewArrange(this IViewHandler handler, Rect f
}

var platformView = handler.ToPlatform();
var context = platformView?.Context;

if (platformView == null || context == null)
if (platformView == null)
{
return;
}
Expand All @@ -160,7 +158,7 @@ internal static void PrepareForTextViewArrange(this IViewHandler handler, Rect f
// in order to properly handle any TextAlignment properties and some internal bookkeeping
if (virtualView.NeedsExactMeasure())
{
platformView.Measure(context.MakeMeasureSpecExact(frame.Width), context.MakeMeasureSpecExact(frame.Height));
platformView.Measure(platformView.MakeMeasureSpecExact(frame.Width), platformView.MakeMeasureSpecExact(frame.Height));
}
}

Expand All @@ -185,10 +183,10 @@ internal static bool NeedsExactMeasure(this IView virtualView)
return true;
}

internal static int MakeMeasureSpecExact(this Context context, double size)
internal static int MakeMeasureSpecExact(this PlatformView view, double size)
{
// Convert to a native size to create the spec for measuring
var deviceSize = (int)context!.ToPixels(size);
var deviceSize = (int)view.ToPixels(size);
return MeasureSpecMode.Exactly.MakeMeasureSpec(deviceSize);
}
}
Expand Down

0 comments on commit bd1c013

Please sign in to comment.