web-dev-qa-db-ja.com

グリッドとStackPanel、どちらがより良いパフォーマンスを持っていますか?

これらのコードを読んでみましょう。WindowsPhone8プロジェクトで2つの類似したUserControlを定義しましたが、どちらが優れているかを本当に知りたいと思います。プロファイリングを確認しましたが、ほぼ同じようです。

UserControl 1、グリッドのプロパティを使用してレイアウトを設計します。

<Grid x:Name="LayoutRoot" Background="{StaticResource PhoneChromeBrush}" Height="108">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition Height="Auto"></RowDefinition>
    </Grid.RowDefinitions>

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"></ColumnDefinition>
        <ColumnDefinition Width="*"></ColumnDefinition>
    </Grid.ColumnDefinitions>

    <Rectangle Grid.RowSpan="2" Grid.Row="0" Height="108" Width="54" Fill="Blue"></Rectangle>
    <TextBlock Grid.Row="0" Grid.Column="1" Text="Caption" Style="{StaticResource PhoneTextExtraLargeStyle}"></TextBlock>
    <TextBlock Grid.Row="1" Grid.Column="1" Text="URLURLURLURLURLURL" Style="{StaticResource PhoneTextSmallStyle}"></TextBlock>
</Grid>

UserControl 2、StackPanelを使用してレイアウトを設計します。

<Grid x:Name="LayoutRoot" Background="{StaticResource PhoneChromeBrush}" Height="108">
    <StackPanel Orientation="Horizontal">
        <Rectangle Height="108" Width="54" Fill="Red"></Rectangle>
        <StackPanel Orientation="Vertical">
            <TextBlock Text="Caption" Style="{StaticResource PhoneTextExtraLargeStyle}"></TextBlock>
            <TextBlock Text="URLURLURLURLURLURL" Style="{StaticResource PhoneTextSmallStyle}"></TextBlock>
        </StackPanel>
    </StackPanel>
</Grid>

基本的なレイアウトは同じようです。しかし、XAMLスパイを使用して視覚化ツリーを分析すると、UserControl 1のノード数は少なくなりますが、メモリのコストが少し高くなります。どうして?

16
Eddie

この質問への回答に興味があるかもしれません: レンダリング時間とパフォーマンスの観点から、パネルはどの順序で最も効率的ですか?

簡単に言うと、パネルの子の数と、それらの要素のサイズと位置によって異なります。ただし、ほとんどの場合、StackPanelGridよりも効率的です。これは、メジャーとアレンジメントパスの両方が高速であるためです。

受け入れられた回答 から引用するには:

グリッド

列と行で構成される柔軟なグリッド領域を定義します。

比例サイジングまたは自動サイジングが使用されている場合、これは最もパフォーマンスを重視するパネルになる可能性があります。子アイテムのサイズの計算は、アイテムのネイティブサイズとグリッドで指定されたレイアウトの複雑な組み合わせになる場合があります。レイアウトもすべてのパネルの中で最も複雑です。メジャーパスでは低速から中程度のパフォーマンス、アレンジメントパスでは低速から中程度のパフォーマンス。

StackPanel

子要素を、水平方向または垂直方向に配置できる1本の線に配置します。

StackPanelは、方向とは反対の方向のネイティブまたは相対サイズと、方向の方向のネイティブサイズを使用して、子を測定します(位置合わせはこの方向には何もしません)。これにより、この分野の中間レベルのパフォーマーになります。アレンジメントパスは、単にアイテムを順番に並べるだけです。おそらく、このパスで2番目に優れたパフォーマンスです。メジャーパスでは中程度のパフォーマンス、レイアウトパスでは高速パフォーマンス。

また、メモリ消費に関しては、両方のオブジェクトが異なり、異なる量のメモリを使用します。また、GridにはRowDefinitionsColumnDefinitionsがあるため、実際には、 StackPanel

32
Rachel