XAML performance optimieren

Eigenlicht wollte ich für Visual Studio 2015 ein wenig mit den neuen Diagnosetools für WPF experimentieren. Ich brauche also guten und schlechten XAML Code.

Dazu nehme ich ein großes Bild (ca 4MB) und packe es in ein Visual Studio WPF Projekt. Das ist generell schon mal keine gute Idee. Ressourcen sollten extern liegen alleine um eine vernünftige Startzeit zu gewährleisten. Aber darum geht es nicht. Als nächstes wird das Bild abgerundet indem es als Hintergrund eines Kreises dient.

   1:  <Ellipse Width="50" Height="50">
   2:              <Ellipse.Fill>
   3:                  <ImageBrush ImageSource="image1.png" />
   4:               </Ellipse.Fill>
   5:  </Ellipse>

Wer sich mit WPF beschäftigt, weis das das Bild in voller Pracht ins User Interface gerendert wird. Die netten Jungs aus Redmond haben das Problem erkannt. Es könnte ja zb eine ganze Liste von Bildern sein die aus dem Internet gezogen werden.  Deswegen gibt es die Attribute für die Decodierungsgröße des Bitmaps.

   1:   <Ellipse Width="50" Height="50">
   2:      <Ellipse.Fill>
   3:                  <ImageBrush>
   4:                      <ImageBrush.ImageSource>
   5:    <BitmapImage DecodePixelHeight="50" DecodePixelWidth="50" UriSource="image1.png" />
   6:                      </ImageBrush.ImageSource>
   7:                  </ImageBrush>
   8:       </Ellipse.Fill>
   9:   </Ellipse>

 

Und nun die Überraschung. Die WPF Anwendung Variante 1 zeigt im Taskmanager 43,6 MB Speicherbelegung und in Variante 2 – 17,8 MB.

Der Gegencheck mit den Visual Studio  Performance und Diagnostics hub aus dem Debug Menü-> Start Diagnostic Tools Without Debugging (ALT+F2). Oder auf Deutsch Diagnosetool ohne Debugging starten.

Gibt zwar andere Zahlen aber den gleichen Konsens

image

Da ich auch mit Windows 10 experimentiere selber Test aber als Universal Windows Platform UWP App.

Das Ergebnis des Speicher Profiling ist vergleichbar, wobei der Unterschied noch größer ist. Generell scheint der Speicherhunger einer UWP App etwas geringer. Dies könnte an .net native liegen.

image

Wenn man vom Debug in den Release Mode wechselt, reduziert sich der Speicherbedarf nochmal deutlich.

Kommentare sind geschlossen