Leistungsvorteile durch Stile

Styles werden standardmäßig in der Layout- und Zeichenphase von Compose angewendet. So müssen keine lambdabasierten Modifizierer erstellt werden, da die Kompositionsphase bei Styles immer übersprungen wird.

Phasen von Compose und Ausführung von Styles
Abbildung 1: Phasen von Compose und wo Stile ausgeführt werden

Die Leistungssteigerungen im Vergleich zu Anpassungen beruhen auf drei primären Optimierungen:

  • Phasenverschiebung: Bei Stilen wird oft die Draw-Phase anvisiert. Wenn sich ein Wert ändert, wird in Compose nur die betroffene Phase (z.B. „Redraw“) ungültig gemacht, anstatt eine vollständige Neukomposition oder ein vollständiges Neulayout auszulösen.
  • Lazy Allocation: Bei Styles wird die Zuweisung von Animationsressourcen aufgeschoben, bis eine Animation tatsächlich beginnt. Dadurch wird der Aufwand bei der ersten Komposition reduziert.
  • Geringerer Objekt-Overhead: Bei verketteten Modifizierern wird für jede Eigenschaft (z.B. „padding“, „border“) ein Objekt zugewiesen. Für Stile wird ein einzelnes Lambda verwendet, um mehrere Eigenschaften anzuwenden. Dadurch werden Arbeitsspeicherzuweisungen erheblich reduziert. Wenn ein Stil in einem Theme definiert ist, wird diese Lambda-Funktion für alle Komponenten freigegeben, die dieses Theme verwenden.

Die folgende Tabelle zeigt beispielhafte Ergebnisse eines internen Leistungsbenchmarks für Compose 1.11.0-alpha06 von Styles im Vergleich zu einer Implementierung in Compose ohne Styles.

Der basic_box_border_change-Test zeigt die Stärke des Stilsystems beim Vermeiden der Zuweisung mehrerer Modifikatorobjekte bei Attributaktualisierungen. Dies führt zu einer massiven Reduzierung der Zuweisungen um etwa 77% und einer Reduzierung der Zeit um etwa 59 %.

Testmethode

Beschreibung

Zeitänderung

Änderung der Zuweisung

basic_box_border_change

Schaltet die Rahmenfarbe eines Box um, um die Aktualisierungsleistung zu messen.

-59,91%

-77,22%

input_state_basic_box

Vergleicht stilbasierte Hover-/Fokus-/Drückstatus mit der manuellen Erfassung von Interaktionsstatus.

-5,24%

–14,72%

basic_box

Misst die anfängliche Komposition und das Layout eines Box mit fünf verketteten Modifikatoren.

–4,78%

-6,60%

basic_text

Rendert fünf BasicText-Komponenten mit hartcodierten Strings.

+0,62%

+2,41%

basic_text_provided_color

Vergleich zwischen dem Festlegen der Textfarbe über einen Stil und der Verwendung von CompositionLocalProvider.

+5,86%

+9,82%