Profilierung von Kotlin-Code: Engpässe finden

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum die Profilerstellung von Kotlin-Code entscheidend ist



Bei der Entwicklung mit Kotlin – einer modernen, prägnanten und sicheren Sprache für JVM, Android und plattformübergreifende Projekte – bleibt die Leistung oft im Hintergrund. Wir schreiben sauberen Code, verwenden Coroutinen, Delegaten und Erweiterungen, aber eines Tages beginnt die Anwendung zu ruckeln: Animationen hängen, API-Anfragen dauern länger als erwartet und der Speicher wächst explosionsartig. In solchen Fällen helfen Intuition und Code-Reviews nicht weiter – ein wissenschaftlicher Ansatz ist gefragt.



Profiling ist der Prozess der Messung von Ausführungszeit, Speichernutzung, CPU-Auslastung und anderen Metriken, um Engpässe zu identifizieren. Ohne Profiling riskieren Sie, die falschen Bereiche zu optimieren und Stunden mit nutzlosen Mikrooptimierungen zu verschwenden. In diesem Artikel werden wir behandeln, wie man Kotlin-Code profiled, welche Tools man verwendet und wie man die Ergebnisse interpretiert. Das Material ist nützlich für Android-Entwickler, Backend-Ingenieure, die mit Ktor arbeiten, und alle, die Kotlin für die JVM schreiben.



Wichtige Metriken und Profiling-Tools



Bevor wir uns in den Code vertiefen, ist es wichtig zu verstehen, was wir genau messen. Die wichtigsten Profiling-Metriken sind:



  • CPU Time – wie viel Prozessorzeit eine Methode oder ein Codeblock in Anspruch genommen hat.
  • Wall Clock Time – die tatsächliche Zeit vom Start bis zum Ende der Ausführung, einschließlich Wartezeiten bei Ein-/Ausgabe.
  • Heap Memory – die Anzahl der im Heap erstellten Objekte und die Zeit für die Garbage Collection (GC).
  • Anzahl der Allokationen – wie oft ein neues Objekt erstellt wurde. Dies ist oft ein versteckter Leistungskiller.


Für Kotlin auf der JVM stehen folgende Tools zur Verfügung:



  • IntelliJ Profiler (Async Profiler) – der in IntelliJ IDEA Ultimate integrierte Profiler für CPU und Speicher. Unterstützt Sampling und Tracing.
  • JProfiler – ein leistungsstarkes kommerzielles Tool mit Visualisierung von Threads, Heap und GC.
  • VisualVM – ein kostenloser Profiler, der im JDK enthalten ist. Ermöglicht die Überwachung einer laufenden Anwendung.
  • YourKit – ein weiterer kommerzieller Profiler mit hervorragender Unterstützung für Kotlin und Coroutinen.
  • Android Studio Profiler – für Android-Anwendungen: CPU, Memory, Network und Energy.


Für Mikro-Benchmarking (Messung der Leistung einzelner Funktionen) verwenden Sie kotlinx-benchmark – eine Bibliothek, die auf JMH (Java Microbenchmark Harness) basiert.



Praktisches Beispiel: CPU- und Speicher-Profiling



Schritt 1: Vorbereitung des Codes für das Profiling



Angenommen, wir haben eine Funktion, die eine Liste von Benutzern verarbeitet und einen Bericht erstellt. Wir vermuten, dass sie langsam läuft. Hier ist der ursprüngliche Code:



data class User(val id: Int, val name: String, val email: String)

fun generateReport(users: List<User>): String { val sb = StringBuilder() for (user in users) { sb.append("ID: ${user.id}, Name: ${user.name}, Email: ${user.email}") } // Zusätzliche Verarbeitung: Filtern und Sortieren val filtered = users.filter { it.email.contains("@") } .sortedBy { it.name } for (u in filtered) { sb.append("Filtered: ${u.name}") } return sb.toString()}


Es sieht harmlos aus, aber bei einer Liste von 100.000 Elementen könnte dies zum Problem werden.



Schritt 2: CPU-Profiling in IntelliJ IDEA starten



Öffnen Sie IntelliJ IDEA Ultimate, starten Sie die Anwendung und wählen Sie Run → Profile 'main' (oder verwenden Sie das Profiling-Symbol neben der Run-Schaltfläche). IntelliJ startet den Async Profiler und zeigt ein Flame Graph an.



Nach Abschluss des Profilings sehen Sie etwa Folgendes:



CPU profiling result:- generateReport: 85% der Zeit  - String conc                

Blogs

Buchempfehlungen