パフォチューは 千里の道も一歩から 的な。

 現在、携わっているプロジェクトのとある画面に、更にコントロールを追加することになった。その画面は、ただせさえ数十ののコントロールを持っていて(DataGridも複数あり)、他の画面より起動に時間が掛かっているのに。その「追加予定のコントロールを別画面に」という案は、強権持ちのユーザーさんに却下されている為、しょうがないなってんで、ちょっとでも速度を落とさない為に再度パフォーマンスアップできないかを調べてみることにした。
なお、パフォーマンスやメモリリークに関することは、以前も書いていた。
メモリリークやパフォーマンスに関する事をメモっとく。
 で、本家本元、マイクロソフトのサイトにパフォチューに関する記事があるので、見返していた。
WPF アプリケーションのパフォーマンスの最適化
この中に、パフォーマンスの最適化 : アプリケーション リソースという章があり、その後で自分が作ったカスタムコントロールを眺めていると、あるControlTemplate内で以下のようにしているのを見つけた。
<Style TargetType="{x:Type local:MyCustomControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:MyCustomControl}">
<Border x:Name="PART_Border">
<Border.Resources>
<Style x:Key="DefaultxxxxStyle" TargetType="TextBox">
<Setter Property="Margin" Value="2,0"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
</Border.Resources>
<Grid>
<Grid.ColumnDefinitions>
</Grid.ColumnDefinitions>
<!--省略-->
</Grid>
</Border>
<ControlTemplate>
</Setter.Value>
</Setter>
</Style>
でだ。どうも、これはよろしくない感じがする。何がよろしくないのかというと。
Templateの中身は、このスタイルを適用したカスタムコントロールに適用する際には、複製される。当然の事ながら、適用するコントロールが二つあると、二つのインスタンスが作られる。なので、このBorder内に定義したResourcesも当然ながら二つある事になる。このスタイルそのものは、Template内のあるTextBoxに適用したいスタイルなので、別にインスタンス毎に必要な訳ではない。更に、マイクロソフトの記事よれば、ResourceDictionaryの扱いには気をつけろ…。
ということは、これ、無駄に持っているのではないか?という推測に至った。なので、以下のように修正した。
<Style TargetType="{x:Type local:MyCustomControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:MyCustomControl}">
<ControlTemplate.Resources>
<Style x:Key="DefaultxxxxStyle" TargetType="TextBox">
<Setter Property="Margin" Value="2,0"/>
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
</ControlTemplate.Resources>
<Border x:Name="PART_Border">
<Grid>
<Grid.ColumnDefinitions>
</Grid.ColumnDefinitions>
<!--省略-->
</Grid>
</Border>
<ControlTemplate>
</Setter.Value>
</Setter>
</Style>
こうすることで、DefaultxxxxStyleというキーを持つスタイルは、Border毎ではなく、ControlTenmplate内にある為、インスタンスは一つになり、メモリの無駄遣いが多少減ると思われる。「思われる」というのはまだ確認前だから。まあ、これで劇的に速くなるかと、聞かれると「さぁ。」とか「多分」とか「ちょっとだけ」としか言いようがない。速くなった所で「数百ミリ秒」とかの世界になる。ただ、速くできるなら速くしておくに越したことはないと思うし、まさに「千里の道も一歩から」なのである。
チューニングってコツコツいくしかないんだよなぁ。
 ちなみに、スタイルやBrushなんかの定義をApplication内のResourcesに持たせると、起動時にそれらを全部Loadしようとするので、それはそれで逆に重くなるらしい。結局トライ・アンド・エラーで調整していくしかないんだろうな。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 2 | トラックバック: 0


この記事へのコメント

承認待ちコメント
このコメントは管理者の承認待ちです
承認待ちコメント
このコメントは管理者の承認待ちです

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m