React Application Performance Profiling

Heute werden wir über das Messen der Leistung beim Rendern von React-Komponenten mithilfe der React Profiler-API sprechen. Wir werden auch Interaktionen mit der Komponente mithilfe der neuen experimentellen Interaction Tracing-API bewerten. Darüber hinaus verwenden wir die User Timing API, um unsere eigenen Messungen durchzuführen.

Wir werden die React Movies Queue-Anwendung als Plattform für Experimente verwenden.


Reagieren Sie auf die Warteschlangen-App für Filme

React Profiler API


Die React Profiler-API dient zur Messung der Renderleistung und zur Ermittlung von Engpässen bei der Anwendungsleistung.

import React, { Fragment, unstable_Profiler as Profiler} from "react";

Die Komponente Profilerakzeptiert einen Rückruf onRenderals Eigenschaft. Es wird jedes Mal aufgerufen, wenn eine Komponente im Profilbaum eine Aktualisierung festschreibt.

const Movies = ({ movies, addToQueue }) => (
  <Fragment>
    <Profiler id="Movies" onRender={callback}>

Versuchen wir zu Testzwecken, die Zeit zu messen, die zum Rendern von Teilen einer Komponente erforderlich ist Movies. So sieht es aus.


Die React Movies Queue-App und die Filmrecherche mit den React Developer

Callback-ToolsonRenderakzeptieren Parameter, die beschreiben, was gerendert wird und wie lange das Rendern dauert. Dies umfasst Folgendes:

  • id: Eigenschaft idaus dem Komponentenbaum, Profilerfür den die Änderung festgeschrieben wurde.
  • phase: oder mount(wenn der Baum montiert wurde) oder update(wenn der Baum neu gerendert wurde).
  • actualDuration: Die Zeit, die zum Rendern eines festen Updates benötigt wird.
  • baseDuration: Geschätzte Zeit zum Rendern des gesamten Teilbaums ohne Caching.
  • startTime: Die Zeit, zu der React mit dem Rendern dieses Updates begann.
  • commitTime: Der Zeitpunkt, zu dem React dieses Update festgeschrieben hat.
  • interactions: Viele "Interaktionen" für dieses Update.

const callback = (id, phase, actualTime, baseTime, startTime, commitTime) => {
    console.log(`${id}'s ${phase} phase:`);
    console.log(`Actual time: ${actualTime}`);
    console.log(`Base time: ${baseTime}`);
    console.log(`Start time: ${startTime}`);
    console.log(`Commit time: ${commitTime}`);
}

Wir laden die Seite und rufen die Chrome Developer Tools-Konsole auf. Dort sollten wir folgendes sehen.


Profilerstellung von Ergebnissen in Entwicklertools Darüber

hinaus können wir die React-Entwicklertools öffnen, zum Lesezeichen gehenProfilerund Informationen zum Zeitpunkt des Renderns von Komponenten anzeigen. Unten sehen Sie eine Visualisierung dieser Zeit in Form eines Flammengraphen.


Arbeiten mit Profilerstellungsergebnissen in React Developer Tools

Ich verwende hier auch gerne den AnsichtsmodusRanked, der eine geordnete Ansicht der Daten bietet. Daher stehen die Komponenten, deren Rendern am meisten Zeit in Anspruch nimmt, ganz oben auf der Liste.


Anzeigen von Profilerstellungsergebnissen im Ranglistenmodus.

Darüber hinaus können Sie mehrere Komponenten verwenden, um Messungen in verschiedenen Teilen der Anwendung durchzuführenProfiler:

import React, { Fragment, unstable_Profiler as Profiler} from "react";

render(
  <App>
    <Profiler id="Header" onRender={callback}>
      <Header {...props} />
    </Profiler>
    <Profiler id="Movies" onRender={callback}>
      <Movies {...props} />
    </Profiler>
  </App>
);

Und wie analysiert man Benutzerinteraktionen mit Komponenten?

Interaction Tracing API


Es wäre schön, Benutzerinteraktionen mit der Anwendungsoberfläche verfolgen zu können (z. B. Klicks auf Elemente). Auf diese Weise können Sie Antworten auf interessante Fragen wie diese finden: "Wie lange hat das Aktualisieren des DOM nach dem Klicken auf diese Schaltfläche gedauert?". Glücklicherweise bietet React experimentelle Unterstützung für die Analyse von Benutzerinteraktionen mit der Anwendung mithilfe der Interaction Tracing-API aus dem neuen Scheduler- Paket . Die Dokumentation dazu können Sie hier lesen .

Informationen zu den Interaktionen zwischen dem Benutzer und der Anwendung werden mit Beschreibungen (z. B. „Der Benutzer hat auf die Schaltfläche In den Warenkorb geklickt“) und Zeitstempeln bereitgestellt. Darüber hinaus werden beim Einrichten der Analyse von Interaktionen Rückrufe verwendet, bei denen Aktionen ausgeführt werden, die der einen oder anderen Interaktion entsprechen.

In unserer Anwendung gibt es eine Schaltfläche, Add Movie To Queueauf der das Symbol angezeigt wird +. Es dient zum Hinzufügen von Filmen zur Anzeigewarteschlange.


Schaltfläche zum Hinzufügen eines Films zur Anzeigewarteschlange

Hier ist ein Beispiel für Code, der Statusaktualisierungen für diese Benutzerinteraktion mit der Anwendung überwacht:

import { unstable_Profiler as Profiler } from "react";
import { render } from "react-dom";
import { unstable_trace as trace } from "scheduler/tracing";

class MyComponent extends Component {
  addMovieButtonClick = event => {
    trace("Add To Movies Queue click", performance.now(), () => {
      this.setState({ itemAddedToQueue: true });
    });
  };
}

Wir können Informationen zu dieser Interaktion aufzeichnen und deren Dauer erfahren, indem wir uns an die React-Entwicklertools wenden.


Analyse der Benutzerinteraktion mit einem Anwendungselement

Mithilfe der Interaction Tracing-API können Sie auch Informationen zum ersten Komponenten-Rendering erfassen:

import { unstable_trace as trace } from "scheduler/tracing";

trace("initial render", performance.now(), () => {
   ReactDom.render(<App />, document.getElementById("app"));
});



Analyse des ersten Renderings der Komponente

Der Autor der API gibt weitere Beispiele für deren Verwendung. Beispiel: Veranschaulichung der Profilerstellung für asynchrone Aufgaben.

Puppenspieler


Für die Automatisierung des Testens der Benutzerinteraktion mit Anwendungselementen kann die Verwendung von Puppeteer interessant erscheinen . Dies ist eine Node.js-Bibliothek, die Zugriff auf eine übergeordnete API bietet, mit der ein Chrome-Browser ohne Benutzeroberfläche mithilfe des DevTools-Protokolls gesteuert werden kann.

Wenn Puppeteer verwendet wird , wird der Entwickler mit Helfern bereitgestellt Methoden tracing.start() und tracing.stop()entwickelt , um collect DevTools Leistungsindikatoren. Im Folgenden finden Sie ein Beispiel für die Verwendung dieser Mechanismen, um Daten darüber zu sammeln, was passiert, wenn Sie auf die für uns interessante Schaltfläche klicken.

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  const navigationPromise = page.waitForNavigation();
  await page.goto('https://react-movies-queue.glitch.me/')
  await page.setViewport({ width: 1276, height: 689 });
  await navigationPromise;

  const addMovieToQueueBtn = 'li:nth-child(3) > .card > .card__info > div > .button';
  await page.waitForSelector(addMovieToQueueBtn);

  //  ...
  await page.tracing.start({ path: 'profile.json' });
  //   
  await page.click(addMovieToQueueBtn);
  //  
  await page.tracing.stop();

  await browser.close();
})()

Nachdem wir die Datei profile.jsonin die PerformanceSymbolleiste des Entwicklers geladen haben , können wir sehen, welche Funktionsaufrufe durch einen Klick auf eine Schaltfläche ausgelöst wurden.


Analyse der Folgen des Klickens auf die Schaltfläche

Wenn Sie sich für das Thema Analyse der Komponentenleistung interessieren, schauen Sie sich dieses Material an.

User Timing API


Mit der User Timing API kann der Entwickler benutzerdefinierte Leistungsmetriken mit hochgenauen Zeitstempeln erstellen. Die Methode window.performance.mark()erstellt einen Zeitstempel, dem der Name zugewiesen ist. Mit dieser Methode window.performance.measure()können Sie die zwischen zwei Messungen verstrichene Zeit ermitteln.

//     
performance.mark('Movies:updateStart');
//  

//     
performance.mark('Movies:updateEnd');

//        
performance.measure('moviesRender', 'Movies:updateStart', 'Movies:updateEnd');

Wenn Sie eine React-Anwendung mithilfe der Registerkarte " PerformanceChrome Developer Tools" profilieren , finden Sie einen Abschnitt Timingmit temporären Metriken zu React-Komponenten. React kann diese Informationen während des Renderns mithilfe der User Timing API veröffentlichen.


Registerkarte "Leistung" der Chrome-Entwicklertools

Beachten Sie, dass die Benutzerzeitgeber-APIs aus den React DEV-Assemblys entfernt und durch die React Profiler-API ersetzt werden, die genauere Zeitstempel bereitstellt. Möglicherweise wird die Unterstützung für diese API in Zukunft zurückgegeben, indem dies für diejenigen Browser zurückgegeben wird, die die User Timing Level 3-Spezifikation unterstützen. 

Im Internet finden Sie möglicherweise React-Sites, die die User Timing-API verwenden, um ihre eigenen Metriken zu ermitteln. Dies umfasst beispielsweise die Reddit-Time to first post title visibleMetrik und die Spotify-MetrikTime to playback ready.


Spezielle Metriken, die auf React-Sites verwendet werden

Metriken, die von der User Timing-API erstellt wurden, werden bequemim Leuchtturmfenster derChrome-Entwicklertools angezeigt .


Metriken im Leuchtturmbedienfeld

Die neuesten Versionen von Next.js enthalten beispielsweise benutzerdefinierte Metriken und Mechanismen zum Messen vieler verschiedener Ereignisse. Folgendes ist mit eingeschlossen:

  • Next.js-hydration: Zeit, die erforderlich ist, um vorgerenderte Markups in den Betriebszustand zu bringen.
  • Next.js-nav-to-render: Die Zeit vom Beginn der Navigation bis zum Beginn des Renderns.

Alle diese Messungen werden im Bereich angezeigt Timings.


Analyse der Next.js-Metriken

Entwicklertools und Leuchtturm


Ich erinnere Sie daran, dass Lighthouse und die PerformanceChrome Developer Toolbar verwendet werden können, um den Ladevorgang und die Leistung von React-Anwendungen eingehend zu analysieren. Hier finden Sie Metriken, die sich besonders auf die Wahrnehmung von Seiten durch Benutzer auswirken.


Analyse der Seitenleistung

Diejenigen, die mit React arbeiten, mögen möglicherweise die Tatsache, dass ihnen neue Metriken zur Verfügung stehen - wie die TBT- Metrik ( Total Blocking Time ), die Informationen darüber gibt, wie lange sich die Seite bis zu dem Zeitpunkt im nicht interaktiven Modus befindet kann zuverlässig im interaktiven Modus ( Time to Interactive ) arbeiten. Hier sind die TBT-Indikatoren („vor“ und „nach“) für eine Anwendung, die einen experimentellen Wettbewerbsmodus verwendet, dessen Verwendung der Anwendung hilft, sich an die Funktionen der Umgebung anzupassen, in der sie ausgeführt wird.


TBT ändern

Diese Tools sind nützlich, umEngpässe bei der Anwendungsleistung zu analysieren, z. B. Aufgaben , derenAusführunglange dauert und die den Online-Übergang der Anwendung verzögern. Dies kann sich beispielsweise auf eine Analyse der Reaktionsgeschwindigkeit der Anwendung auf Knopfdruck beziehen.


Darüber

hinaus gibt die Analyse der Lighthouse- Anwendung den React-Entwicklern viele spezifische Tipps zu vielen Themen. Unten sehen Sie das Analyseergebnis in Lighthouse 6.0 . Hier wird der Abschnitt Nicht verwendetes JavaScript entfernen geöffnet, der über nicht verwendeten JavaScript-Code berichtet, der in die Anwendung geladen wird und mit dem importiert werden kannReact.lazy().


Analysieren einer Anwendung in Lighthouse-

Anwendungen sind immer nützlich, um Hardware zu testen, die den Endbenutzern höchstwahrscheinlich zur Verfügung steht. Ich verlasse mich oft auf Webpage und RUM und Crux Datenin solchen Dingen, die mir erlaubenvollständigere Informationen überAnwendungsleistung zu erhalten.

Liebe Leser! Wie untersuchen Sie die Leistung Ihrer React-Anwendungen?


All Articles