Array-Sortierung in Swift: Schockierende Leistungstests

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

Swift Beta Performance: Array-Sortierung – was ist schiefgelaufen?

\n\n

Wenn Sie jemals in der Ära der ersten Beta-Versionen von Swift auf Stack Overflow gestöbert haben, erinnern Sie sich sicher an die legendäre Frage, die tausende Aufrufe und hunderte Kommentare sammelte. Sie lautete ungefähr so: „Warum ist die Array-Sortierung in Swift Beta 100-mal langsamer als in Objective-C?“

\n\n

Damals, im Jahr 2014, war das ein echter Schock für die iOS-Community. Entwickler, die die blitzschnelle Sortierung in Objective-C gewohnt waren, sahen plötzlich, wie ihre Anwendungen auf der Stelle hängen blieben. Heute, Jahre später, können wir dieses Problem in Ruhe analysieren: verstehen, was genau die Verlangsamung verursachte, wie Swift sich weiterentwickelt hat und vor allem, wie man Arrays im modernen Swift richtig sortiert, um die Fehler der Vergangenheit nicht zu wiederholen.

\n\n

In diesem Artikel werden wir nicht einfach den alten Fehler nacherzählen. Wir führen eigene Tests durch, schreiben Code und finden heraus, welche Sortieralgorithmen in Swift wirklich schnell sind und welche eine Falle für Anfänger darstellen. Los geht‘s!

\n\n

Kurze Vorgeschichte: Was geschah in Swift Beta?

\n\n

In der ersten Beta-Version von Swift konnte das Sortieren eines Arrays mit 100.000 ganzen Zahlen bis zu 20 Sekunden dauern. In Objective-C wurde derselbe Vorgang in 0,2 Sekunden ausgeführt. Ein Unterschied um das 100-fache! Der Grund lag darin, dass das frühe Swift eine ineffiziente Implementierung des Sortieralgorithmus verwendete (Introsort mit schlechter Pivot-Wahl) und außerdem Probleme mit der Optimierung bei der Kompilierung ohne Optimierungsflags (-O) hatte.

\n\n

Darüber hinaus wurde in der Beta-Version häufig der Mechanismus der dynamischen Grenzprüfung (bounds checking) für jeden Array-Zugriff ausgelöst, was enorme zusätzliche Kosten verursachte. Die Schlussfolgerung war einfach: Swift war roh, aber das Potenzial war enorm.

\n\n

Wie sortiert man Arrays in Swift heute? Best Practices

\n\n

Modernes Swift (Version 5.x und neuer) ist eine ausgereifte Sprache. Die Array-Sortierung ist nicht nur schnell, sondern eine der schnellsten unter den gängigen Sprachen. Lassen Sie uns die grundlegenden Methoden durchgehen.

\n\n

1. Die eingebaute Methode sort() – der Goldstandard

\n\n

Der einfachste und empfohlene Weg ist die Verwendung der Methode sort() (Sortierung an Ort und Stelle) oder sorted() (gibt ein neues sortiertes Array zurück).

\n\n
import Foundation\n\nvar numbers = [5, 3, 8, 1, 9, 2]\nnumbers.sort() // Sortierung an Ort und Stelle\nprint(numbers) // [1, 2, 3, 5, 8, 9]\n\nlet sortedNumbers = numbers.sorted() // gibt ein neues Array zurück\nprint(sortedNumbers) // [1, 2, 3, 5, 8, 9]
\n\n

Intern verwendet sort() TimSort – einen hybriden Algorithmus, der im Durchschnitt mit O(n log n) und bei fast sortierten Daten mit O(n) arbeitet. Es ist derselbe Algorithmus, der in Python und Java verwendet wird. Er ist hervorragend für moderne Prozessoren optimiert.

\n\n

2. Sortierung mit Closure: Anpassung

\n\n

Wenn Sie ein Array absteigend oder nach einem komplexen Kriterium sortieren müssen, verwenden Sie ein Closure:

\n\n
let words = ["Apfel", "Orange", "Banane", "Kiwi"]\nlet sortedByLength = words.sorted { $0.count < $1.count }\nprint(sortedByLength) // ["Kiwi", "Apfel", "Banane", "Orange"]\n\nlet descendingNumbers = numbers.sorted(by: >)\nprint(descendingNumbers) // [9, 8, 5, 3, 2, 1]
\n\n

Wichtig: Das Closure sollte eine reine Funktion (pure function) sein – ohne Nebenwirkungen. Andernfalls riskieren Sie unvorhersehbares Verhalten und Leistungseinbußen.

\n\n

3. Sortierung benutzerdefinierter Strukturen

\n\n

Wenn Sie mit eigenen Datentypen arbeiten, implementieren Sie am besten das Protokoll Comparable. Dies ermöglicht die Verwendung von sort() ohne Closure.

\n\n
struct Person: Comparable {\n    let name: String\n    let age: Int\n\n    static func < (lhs: Person, rhs: Person) -> Bool {\n        return lhs.age < rhs.age // nach Alter sortieren\n    }\n}\n\nle                

Blogs

Buchempfehlungen