2010-02-12 9 views
14

Unser Designer verwendet Blend zum Gestalten unserer WPF-Anwendung. Wenn er lokale Ressourcen für Eigenschaften auswählt, wendet Blend sie als {DynamicResource} anstelle von {StaticResource} an. Meine Vermutung ist, dass Blend dies tut, weil es ermöglicht, die App zur Laufzeit neu zu gestalten, ohne sie neu starten zu müssen.Gibt es für DynamicResource anstelle von StaticResource erhebliche Leistungskosten?

Meine Frage ist: gibt es einen erheblichen Leistungsaufwand für diese zusätzliche Suche? Sollten wir den Designer bitten, diese Dynamik manuell auf Statik umzustellen?

Hier ist eine große Frage SO, das den Unterschied zwischen den verschiedenen Arten erklärt: What's the difference between StaticResource and DynamicResource in WPF?

Antwort

25

Leider ist dies ein Fall, in dem es sehr schwierig ist, einen direkten Vergleich der relativen Leistung durchzuführen, da der Ort, an dem eine Verschlechterung auftreten würde, tief in der WPF-Engine liegt. In den frühen Tagen von WPF war die Verwendung von StaticResource eine der empfohlenen Standard-Performance-Tuning-Änderungen, die wir in unserer Organisation tendenziell sehr streng befolgten und anderen empfehlen. Ich war wirklich genervt, dass Blend Dynamic alles gemacht hat, obwohl es dazu beigetragen hat, dass Ressourcen von anderen Dateien zur Entwurfszeit richtig gerendert wurden.

Im Laufe der Zeit hat sich meine Sichtweise geändert, was zum Teil auf persönliche Erfahrungen zurückzuführen ist, aber auch auf Rückmeldungen von Leuten aus dem Blend-Team von Microsoft. Wie Sie wahrscheinlich wissen, ist Blend vollständig in WPF geschrieben und hat ein komplettes alternatives Theme (Light), das während der laufenden Anwendung gewechselt werden kann. Dies ist möglich, weil sie DynamicResource für fast alle ihrer Stile verwendet haben. Ihrer Meinung nach hat ihnen das nicht wirklich Probleme bereitet. Angesichts der Tatsache, dass Blend wahrscheinlich die am häufigsten verwendete WPF-Anwendung ist, tendiere ich dazu, ihren Ansichten ein erhebliches Gewicht zu geben.

Die andere Sache zu berücksichtigen ist die tatsächliche Nützlichkeit von DynamicResource. Die Möglichkeit, das Design im Handumdrehen zu ändern, ist ein Teil davon, aber auch die Flexibilität, die es beim Erstellen Ihrer Ressourcenhierarchie bietet, kann die Verwaltung gemeinsam genutzter Stile erheblich vereinfachen. Ich bin sicher, dass Sie in eine Situation geraten sind, in der eine StaticResource-Referenz zur Laufzeit explodiert ist, weil die Ressource, auf die sie zeigte, in einen anderen Zweig der Hierarchie geladen werden sollte.

Offensichtlich ist StaticResource sehr nützlich, um auf einen bestimmten Schlüssel zu zeigen, von dem Sie wissen, dass er zur richtigen Zeit verfügbar sein wird. Wenn ich XAML handschriftlich schreibe, tendiere ich immer noch dazu, es ständig zu benutzen. Aber angesichts der Produktivität, die Sie daraus ziehen, dass ein Designer Ihr XAML in Blend erstellt, ist jeder kleine Leistungsgewinn, den Sie erhalten, wahrscheinlich nicht den Aufwand wert, alles manuell als Statisch zu verwalten.

+0

In Bezug auf Ihre Aussage "Offensichtlich StaticResource ist sehr nützlich für das Zeigen auf einen bestimmten Schlüssel Sie wissen, dass es zur richtigen Zeit verfügbar sein wird. " Bedeutet dies, dass eine DynamicResource die Überprüfung der Kompilierungstypen verliert und zur Laufzeit verschoben wird? – scobi

+0

Ja. In den meisten Fällen erhält eine DynamicResource-Referenz, die nicht aufgelöst wird, nur einen Standardwert (wie Schwarz für Pinsel) und wartet darauf, dass der gesuchte Schlüssel angezeigt wird. Es gibt keine Möglichkeit für den Compiler, diese Situation selbst zu überprüfen. –

+0

Das war sehr hilfreich, danke !! –

5

Es wird gesagt, einen Unterschied in der Leistung sein, sondern darum, ob es „signifikant“ wird davon abhängen, wie viele dynamischen Lookups ist passiert. Wenn Sie nicht über Tausende von DynamicResource-Referenzen verfügen, ist dies wahrscheinlich nicht so oder so auffällig; Wenn dynamische Ressourcen so viel schlechter abschneiden als statische, vermute ich, dass Blend beim Generieren konservativer ist.

In der Tat, wenn ich einen naiven Test lief, fand ich das nicht eingängig Ergebnis, dass Dynamic lief schneller als Static (mit 3000 Ressourcenreferenzen, ich um 200ms Ladezeiten sah, als ich für Dynamic vs. um 400ms für alles verwendet StaticResource).

Dies war ein unrealistischer Test aus verschiedenen Gründen: Alle Referenzen waren auf die gleiche Sache, ich lief unter dem Debugger, etc. etc. Aber es deutet darauf hin, es wäre zu früh, Mühe in die Änderung der Blend-Ausgabe "nur Falls "- und wenn Sie eine Verlangsamung bemerken, ist es nicht unbedingt der Fehler der DynamicResource Referenzen - immer messen!

+1

Ich denke, dass DynamicResouces auf einem Hintergrund Thread geladen werden und nur geladen werden, wenn das Element, das sie verwendet, zulässig wird, so dass das Testen der Geschwindigkeit sehr schwer –

1

Wenn Sie die dynamischen Ressourcen zurück in Statik ändern, wird die Mischung leider unterbrochen. Dies scheint insbesondere dann der Fall zu sein, wenn Sie UserControls verwenden, die auf dynamische Ressourcen verweisen. Wenn Sie sie in static ändern, wird das Steuerelement nicht gerendert, wenn es in einem anderen Steuerelement in Blend gehostet wird.