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 Stilen 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- und Druckstatus 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

Vergleicht das Festlegen der Textfarbe über einen Stil mit der Verwendung von CompositionLocalProvider.

+5,86%

+9,82%