StaticResource ではなく DynamicResource に重大なパフォーマンス コストがかかりますか?

StackOverflow https://stackoverflow.com/questions/2248904

質問

私たちのデザイナーは、WPF アプリケーションのスタイルを設定するために Blend を使用しています。プロパティにローカル リソースを選択すると、Blend はそれらをプロパティとして適用します。 {DynamicResource} の代わりに {StaticResource}. 。私の推測では、Blend がこれを行うのは、アプリを再起動しなくても実行時にアプリのテーマを変更できるためだと思います。

私の質問は次のとおりです。この追加の検索にはパフォーマンスに大きなコストがかかりますか?設計者に、戻って手動でこれらの動的を静的に変更するように依頼する必要がありますか?

これは、タイプの違いを説明する素晴らしいSOの質問です。 WPF の StaticResource と DynamicResource の違いは何ですか?

役に立ちましたか?

解決

残念ながら、これは、パフォーマンスの低下が現れる場所が WPF エンジンの奥深くにあるため、相対的なパフォーマンスを直接比較することが非常に難しいケースです。WPF の初期の頃、StaticResource の使用は、推奨される標準的なパフォーマンス チューニング変更の 1 つであり、私たちの組織内ではこれにかなり厳密に従い、他の人にもそれを推奨する傾向がありました。Blend がデザイン時に他のファイルからリソースを適切にレンダリングするのに役立つにもかかわらず、すべてを動的に実行することに本当にイライラしました。

時間が経つにつれて、個人的な経験だけでなく、Microsoft の Blend チームの人々からのフィードバックも影響して、これに対する私の見方は変わりました。おそらくご存知のとおり、Blend は完全に WPF で書かれており、アプリケーションの実行中にオンザフライで切り替えることができる完全な代替テーマ (ライト) を備えています。これは、ほとんどすべてのスタイル設定に DynamicResource を使用しているため可能です。彼らによれば、これによって実際のパフォーマンスの問題が発生することはありませんでした。Blend がおそらく現存する中で最も広く使用されている WPF アプリケーションであることを考えると、私は彼らの意見をかなり重視する傾向があります。

もう 1 つ考慮すべき点は、DynamicResource の実際の有用性です。スタイルをその場で変更できる機能もその一部ですが、リソース階層を構築する際に柔軟性が得られるため、共有スタイルの管理がはるかに簡単になります。StaticResource 参照が指すリソースが階層の別のブランチに読み込まれるため、実行時に StaticResource 参照が爆発するという状況に遭遇したことがあるかと思います。

明らかに、StaticResource は、適切なタイミングで使用可能になることがわかっている特定のキーを指すのに非常に役立ちます。XAML を手書きするときは、今でも常に XAML を使用する傾向があります。ただし、デザイナーに Blend で XAML を生成してもらうことで得られる生産性を考えると、たとえわずかなパフォーマンスの向上であっても、すべてを静的として手作業で維持するオーバーヘッドに見合う価値はおそらくありません。

他のヒント

パフォーマンスの違いがあると言われていますが、それが「重大」であるかどうかは、動的検索がどれだけ行われるかによって決まります。何千もの DynamicResource 参照がない限り、どちらの場合でもおそらく目立たないでしょう。動的リソースのパフォーマンスが静的リソースよりもはるかに悪い場合、Blend はリソースの生成についてより保守的になるのではないかと思います。

実際、素朴なテストを実行したところ、DynamicResource が実行した直感に反する結果が見つかりました。 もっと早く StaticResource よりも (3000 のリソース参照があるため、すべてに DynamicResource を使用した場合と比べて、読み込み時間は約 200 ミリ秒でした)StaticResource の場合は約 400 ミリ秒)。

これは、次のようなさまざまな理由から非現実的なテストでした。すべての参照は同じものを参照しており、デバッガーの下で実行していました。等しかし、「万が一に備えて」Blend 出力を変更することに力を入れるのは時期尚早であることを示唆しています。また、速度の低下に気づいたとしても、それは必ずしも DynamicResource 参照のせいではない可能性があり、常に測定してください。

残念ながら、動的リソースを静的リソースに戻すと、Blend が壊れてしまいます。これは、動的リソースを参照する UserControl を使用する場合に特に当てはまります。動的リソースを静的リソースに変更すると、Blend の別のコントロール内でホストされているときにコントロールがレンダリングされなくなります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top