Swift Beta performance: Sortieren von arrays
Ich war die Implementierung eines Algorithmus in Swift Beta und bemerkte, dass die performance war sehr schlecht. Nach dem Graben tiefer erkannte ich, dass einer der Engpässe war etwas so einfach wie das Sortieren von arrays. Der relevante Teil ist hier:
let n = 1000000
var x = [Int](repeating: 0, count: n)
for i in 0..<n {
x[i] = random()
}
//start clock here
let y = sort(x)
// stop clock here
In C++, ein ähnlicher Vorgang dauert 0.06 s auf meinem computer.
In Python, dauert es 0,6 s (keine tricks, einfach nur y = sortiert(x) für eine Liste von ganzen zahlen).
Swift dauert es 6s wenn ich es kompilieren mit folgendem Befehl:
xcrun swift -O3 -sdk `xcrun --show-sdk-path --sdk macosx`
Und es dauert so viel wie 88s wenn ich es kompilieren mit folgendem Befehl:
xcrun swift -O0 -sdk `xcrun --show-sdk-path --sdk macosx`
Timings in Xcode mit "Release" statt "Debug" baut ähnlich sind.
Was ist hier falsch? Ich könnte verstehen, dass einige performance-Verlust im Vergleich mit C++, aber nicht für eine 10-fache Verlangsamung im Vergleich zu reinem Python.
Edit: Wetter aufgefallen, dass eine änderung -O3
zu -Ofast
macht dieser code laufen fast so schnell wie die C++ - version! Allerdings -Ofast
ändert sich die Semantik der Sprache sehr viel — in meinen Tests, es deaktiviert die Prüfungen für integer-überläufe und array indexing overflows. Zum Beispiel, mit -Ofast
den folgenden Swift-code automatisch ausgeführt wird, ohne abzustürzen (und druckt einige Müll):
let n = 10000000
print(n*n*n*n*n)
let x = [Int](repeating: 10, count: n)
print(x[n])
So -Ofast
ist nicht das, was wir wollen; der ganze Punkt von Swift ist, dass wir die Sicherheit der Netze statt. Natürlich, die Sicherheit der Netze haben einige Auswirkungen auf die Leistung, aber Sie sollten nicht die Programme, die 100-mal langsamer. Denken Sie daran, dass Java bereits Prüfungen für die array-Grenzen, und in typischen Fällen die Verlangsamung um einen Faktor viel weniger als 2. Und in Clang und GCC haben wir -ftrapv
für die Prüfung (signed) integer-overflows, und es ist nicht so, dass langsam, entweder.
Daher die Frage: wie können wir vernünftige Leistung im Swift-ohne die Sicherheit der Netze?
Edit 2: hab ich etwas mehr benchmarking, mit sehr einfachen Schleifen entlang der Linien von
for i in 0..<n {
x[i] = x[i] ^ 12345678
}
(Hier die xor-operation ist es einfach so, dass ich leichter finden Sie die entsprechenden Schleife in Assembler-code. Ich habe versucht zu Holen ein Vorgang, der leicht zu erkennen ist, sondern auch "harmlos" in dem Sinne, dass es sollte nicht verlangen, für alle Prüfungen im Zusammenhang zu integer-overflows.)
Wieder, es war ein großer Unterschied in der Leistung zwischen -O3
und -Ofast
. Also ich hatte einen Blick auf den assembly-code:
-
Mit
-Ofast
ich bekomme ziemlich viel, was ich erwarten würde. Der relevante Teil ist eine Schleife mit 5 Maschinenbefehle. -
Mit
-O3
ich etwas bekommen, das war jenseits meiner wildesten Phantasie. Die innere Schleife überspannt 88 Zeilen Assembler-code. Ich habe nicht versucht, alles zu verstehen, aber die meisten verdächtigen Teile sind 13 Aufrufe von "callq _swift_retain" und weitere 13 Aufrufe von "callq _swift_release". Das ist, 26 Unterprogramm-Aufrufe in der inneren Schleife!
Edit 3: In den Kommentaren, Ferruccio gebeten, für benchmarks, die sind fair in dem Sinne, dass Sie nicht verlassen sich auf built-in Funktionen (z.B. Sortieren). Ich denke, das folgende Programm ist ein ziemlich gutes Beispiel:
let n = 10000
var x = [Int](repeating: 1, count: n)
for i in 0..<n {
for j in 0..<n {
x[i] = x[j]
}
}
Gibt es keine arithmetische, so brauchen wir nicht zu befürchten, integer-overflows. Das einzige, was wir tun, ist einfach nur eine Menge von array-Referenzen. Und die Ergebnisse sind hier—Swift -O3 verliert durch einen Faktor von fast 500 im Vergleich mit -Ofast:
- C++ -O3: 0.05 s
- C++ -O0: 0,4 s
- Java: 0,2 s
- Python PyPy: 0,5 s
- Python: 12 s
- Swift -Ofast: 0.05 s
- Swift -O3: 23 s
- Swift -O0: 443 s
(Wenn Sie besorgt sind, dass der compiler kann optimieren-aus der sinnlos-Schleifen vollständig, können Sie es ändern, um z.B. x[i] ^= x[j]
, und fügen Sie eine print-Anweisung, Ausgänge x[0]
. Dies ändert nichts an; die Zeiten werden sich sehr ähnlich sein.)
Und ja, hier ist die Python-Implementierung war eine dumme, Reine Python-Implementierung mit einer Liste von ints und verschachtelte for-Schleifen. Es sollte viel langsamer als die nicht optimierte Swift. Irgendwas scheint ernst zu werden gebrochen, mit Swift und array-Indizierung.
Edit 4: Diese Probleme (wie auch einige andere performance-Probleme) scheint fest in der Xcode 6 beta 5.
Zum Sortieren, ich habe jetzt folgende timings:
- clang++ -O3: 0.06 s
- swiftc -Ofast: 0,1 s
- swiftc -O: 0.1 s
- swiftc: 4 s
Geschachtelte Schleifen:
- clang++ -O3: 0.06 s
- swiftc -Ofast: 0,3 s
- swiftc -O: 0,4 s
- swiftc: 540 s
Es scheint, dass es keinen Grund mehr zu verwenden, die die unsichere -Ofast
(ein.k.ein. -Ounchecked
); Ebene -O
produziert gleichermaßen guten code.
- Hier ist ein weiteres "Swift 100 mal langsamer als C" - Frage: stackoverflow.com/questions/24102609/...
- Und hier ist die Diskussion über apples marketing-material im Zusammenhang mit Swift eine gute Leistung in der Sortierung: programmers.stackexchange.com/q/242816/913
- Es wäre noch interessant/informativ, um zu sehen, einen Vergleich zu einem sort-Funktion in Python implementiert. Python ist
sorted()
Funktion ist Teil seiner Laufzeit, die (glaube ich) ist in C geschrieben. - Siehe edit 3. (Es ist nicht eine Art Funktion, aber ich denke es zeigt sehr gut, welche Art von code schlecht in Swift im Vergleich mit allem anderen, einschließlich Python.)
- Können Sie vergleichen Sie es mit Java auch?
- Getan. (Übrigens, eine naive Java-compiler erzeugt langsameren code als eine naive Swift-compiler. In Java berechnen
x[i]
müssen Sie zunächst prüfen, obx != null
und dannx.length > i
. In Swift können wir überspringen Sie die erste Prüfung. Dennoch, wie wir in den benchmarks, Java gewinnt Swift -O3 um einen Faktor von ca. 100.) - Haben Sie gesehen, die zum Teil aus der "the Swift Programming Language" iBook über for-Schleifen? Es sagt, dass "[i] ist eine Konstante, deren Wert automatisch zu Beginn jeder iteration der Schleife.". Vielleicht erklärt es als
var i: Int
vor der Schleife wird die Dinge ändern? - Hängt von der Plattform ab. Null-check nicht erforderlich, wenn die Plattform den virtuellen Speicher und verwendet nicht die niedrigen Speicher-Adressen als gültige Speicherbereiche (z.B. Windows und ich denke, anderen Betriebssysteme auch); die MMU behandelt die null-check in diesem Fall. Überhaupt nicht überraschend, dass eine Marke neue front-end für eine neue Sprache ist schlimmer als eine 6 Jahre alte, Reife, front-end. Ich vermute, Apple wird dieses Problem beheben, bevor Swift ist aus der beta.
- Sie können kompilieren mit:
xcrun --sdk macosx swift -O3
. Es ist kürzer. - Dieser link zeigt einige andere grundlegende Operationen im Vergleich zu Objective-C.
- Denken Sie daran, dass Java bereits Prüfungen für die array-Grenzen, gebunden Kontrollen sind sehr wahrscheinlich zu sein entfernt, weil, wenn der compiler beweisen kann, dass. Java sollte laufen, ziemlich viel wie C (wenn richtig aufgewärmt) in diesem einfachen Fall. Null-Prüfungen sind in der Regel nicht direkt ausgeführt, sondern gefangen von der hardware und der compiler beweisen kann, x[i] ist nicht null für sicher - hat der compiler die jenseits von dumm, um tatsächlich überprüfen Sie für x
null
. - was ist falsch mit der Verwendung von swift 's" Sicherheitsnetze " in Entwicklung-und speichern -Ofast für den release?
- Sie brauchen das "Sicherheitsnetz" bei der Produktion als input variiert. Anders ist es, um Prozess-Werte zwischen 1-10 und multiplizieren Sie Sie im Vergleich zum multiplizieren von Werten im Bereich von 2^31. Zum Beispiel die berühmt-berüchtigten heartbleed-bug wurde verursacht durch einen Mangel an range-check.
- sicher, aber wenn Sie sich der Risiken bewusst, dann sicherlich können Sie bereinigen Ihre Eingänge, wo notwendig, um zu garantieren, dass der überlauf nicht auftreten
- nicht sagen, es ist ideal, aber wenn die Leistung ist die Priorität, dann die Risiken zumindest scheinen überschaubar
- um es einfach auszudrücken, wir Leben nicht in einer perfekten Welt und versucht, zu tun, was Sie vorschlagen, in 1 M LoC-Projekte ist weit härter als man sich das vorstellt. Bugs tun "exis", "stack-overflow" (name der Website) war einer der häufigsten (und immer noch ist) und bevor die no-execute-bit verwendet, um die Ausführung von beliebigem code ermöglichen sehr oft. Java läuft mit voller Bandbreite prüft, ob alle die Zeit und es kommt wirklich nicht auf die Leistung auswirken, dass die Prüfungen und nicht, anmutig, ist eine große Leistung, für die Sprache. In den letzten Jahren gab es eine riesige Sicherheitslücke, durch Umgehung es über die Unsichere scheinbar gut getan-code.
- Jeder weiß, dass jede iteration auf iOS oder OS X, die mehr als 10000 Iterationen durchgeführt werden sollte, die in C oder C++. Wo ist die überraschung? Ist das eine rhetorische Wendung in Frage?
- Übrigens
-Ofast
deaktiviert auch die Prüfungen für unwrapping nils; kompilieren Sie und führen Sie dieses "erfolgreich":let s: Double? = nil; println(s!)
- Mit Beta 5 es wurden beträchtliche Verbesserung in Swift ' s Geschwindigkeit-siehe diesem post von Jesse Squires für weitere Details.
- Wird Sie auch dieses update für Swift 2.0, wie es behauptet, die weitere Leistung zu erhöhen. In meinen eigenen tests fand ich heraus, dass, es sei denn, Sie kompilieren mit -Ounchecked es ist 100000 langsamer, selbst für einfache loop-tests. Mit -Ounchecked es ist "nur" 50 mal langsamer. Immer noch weht es von Python aus dem Wasser, in beiden Fällen.
- Die java-Zahl scheint hoch, so dass ich es selber getestet und bekam mal von 50-60ms, die zum ausführen der code für "=" und 60-80ms, wenn ich die "^=". Hast du den VM-Start Zeit in diesen zahlen, oder vielleicht haben Sie gemeint .02s? Java ist in der Regel so schnell wie C für diese Art von operation. Auch java läßt sich etwa .04(=) und .06(^=) wenn ich die Schleife wiederholt (so dass Java-Zeit, um es zu kompilieren in optimierter Maschinensprache). Die .04 können beinhalten test-breaking-Optimierungen obwohl.
Du musst angemeldet sein, um einen Kommentar abzugeben.
tl;dr Swift 1.0 ist jetzt so schnell wie C, die von diesem benchmark mit dem Standard-release Optimierung-Ebene [-O].
Hier ist ein in-place-quicksort im Swift-Beta:
Und das gleiche in C:
Beide arbeiten:
Beide sind berufen, in das gleiche Programm geschrieben.
Dieser wandelt das absolute Zeiten in Sekunden um:
Hier ist eine Zusammenfassung der compiler-Optimierungs-Stufen:
Zeit in Sekunden mit [persönliches Gespräch] für n=10_000:
Hier ist Swift builtin sort() für n=10_000:
Hier ist [-O] für n=10_000:
Wie Sie sehen können, Swift ' s performance verbessert durch einen Faktor von 20.
Als pro mweathers' Antwort, Einstellung [-Ofast] macht den echten Unterschied aus, der sich in diesen Zeiten für n=10_000:
Und für n=1_000_000:
Zum Vergleich, das ist mit [persönliches Gespräch] für n=1_000_000:
So rasch ohne Optimierungen wurde fast 1000 mal langsamer als C in diesem Maßstab, in diesem Stadium in seiner Entwicklung. Auf der anderen Seite mit beiden Compilern auf [-Ofast] Swift tatsächlich durchgeführt, der mindestens genauso gut wenn nicht etwas besser als C.
Es wurde darauf hingewiesen, dass [-Ofast] ändert die Semantik der Sprache, so dass es möglicherweise unsicher ist. Dies ist, was Apple-Staaten, die in der Xcode 5.0 release Hinweise:
Sie alle, aber befürworten es. Ob das klug ist oder nicht konnte ich nicht sagen, aber was ich sagen kann, scheint es vernünftig genug, um zu verwenden [-Ofast] in einer Freigabe, wenn man nicht tut high-precision-floating-point-Arithmetik, und Sie sind zuversichtlich, kein integer oder array-überläufe möglich sind, in Ihrem Programm. Wenn Sie brauchen high-performance - und overflow-checks /präzise arithmetische dann wählen Sie eine andere Sprache für jetzt.
BETA 3-UPDATE:
n=10_000 mit [-O]:
Swift im Allgemeinen ist ein bisschen schneller und es sieht aus wie Swift gebaut-in der Art geändert hat, ganz deutlich.
LETZTE AKTUALISIERUNG:
[Persönliches Gespräch]:
[-O]:
[-Ounchecked]:
TL;DR: ja, nur die Swift-Sprache die Umsetzung ist langsam, jetzt. Wenn Sie schnelle, numerische (und andere Arten von code, vermutlich) - code, gehen Sie einfach mit anderen. In der Zukunft sollte man dann überdenken Sie Ihre Wahl. Es könnte gut sein, genug für die meisten Anwendungs-code, der geschrieben wird, auf einer höheren Ebene, obwohl.
Von dem, was ich bin zu sehen in SIL-und LLVM-IR, wie es scheint, brauchen Sie eine Reihe von Optimierungen für die Beseitigung behält und Pressemitteilungen, die umgesetzt werden könnten, in Clang (für Objective-C), aber Sie haben nicht portiert, Sie noch nicht. Das ist die Theorie, ich Fahr mit (für jetzt... ich muss noch bestätigen, dass der Klang tut etwas dagegen), da ein profiler run auf die letzten test-bei dieser Frage ergibt dies ein "hübsches" Ergebnis:
Wie gesagt viele andere
-Ofast
ist Total unsicher und wechselt die Sprache Semantik. Für mich ist es die "Wenn du gehst zu verwenden, dass, nutzen Sie einfach eine andere Sprache" Bühne. Ich werde neu bewerten, dass die Wahl später, wenn es änderungen.-O3
wird uns eine ganze Reihe vonswift_retain
undswift_release
Anrufe, die, ehrlich gesagt, nicht so Aussehen wie Sie es sein sollte für dieses Beispiel. Die Optimierer haben sollte, erstellte die (meisten) Ihnen AFAICT, da es weiß, die meisten Informationen, die über das array, und weiß, dass es (mindestens) einen starken Bezug zur it.Sollte es nicht emittieren mehr behält, wenn es nicht sogar den Aufruf von Funktionen, die möglicherweise lassen Sie die Objekte. Ich glaube nicht, dass ein array-Konstruktor ein array zurückgeben, welches kleiner ist als das, was angesprochen wurde, was bedeutet, dass eine Menge von Tests, die emittiert wurden, sind nutzlos. Es weiß auch, dass die ganze Zahl wird nie über 10k, also der überlauf überprüft kann optimiert werden (nicht wegen
-Ofast
Verrücktheit, aber wegen der Semantik der Sprache (sonst ist nichts zu ändern, dass var noch darauf zugreifen können, und das hinzufügen von bis zu 10k ist sicher für die ArtInt
).Der compiler möglicherweise nicht in der Lage sein, um unbox array oder array-Elemente, denn Sie sind immer übergeben
sort()
, die eine externe Funktion, und man muss die Argumente, die es erwartet. Dies macht uns zu verwenden habenInt
Werte indirekt verwiesen wird, die es machen würde, gehen ein bisschen langsamer. Dies könnte sich ändern, wenn diesort()
generische Funktion (nicht in der multi-Methode, Art und Weise) zur Verfügung Stand, um die compiler-und bekam inlined.Dies ist eine sehr neue (öffentlich) Sprache, und es wird durch das, was ich davon ausgehen sind viele Veränderungen, seit es Menschen gibt (stark) beteiligt, mit der schnellen Sprache zu Fragen, für feedback, und Sie alle sagen, die Sprache ist noch nicht fertig und wird ändern.
Code verwendet:
P. S: ich bin kein Experte auf Objective-C noch alle Einrichtungen, die von Kakao, Objective-C oder Swift-Laufzeiten. Ich kann auch vorausgesetzt werden, einige Dinge, die ich nicht geschrieben habe.
-Ofast
"völlig unsicher"? Vorausgesetzt, Sie wissen, wie um den code zu testen und auszuschließen überläuft.-Ofast
ändert sich auch die Sprache-Semantik, aber ich kann nicht alle Fonds docs für Sie. Wie können Sie sicher sein, Sie wissen, was Sie tun?Int[]
", denn das hängt von der Ebene der compiler inline-und es sollte in der Lage sein zu inline die engen Schleifen mit/nach einige Hinweise.Habe ich beschlossen, einen Blick auf das zum Spaß, und hier sind die timings, die ich bekomme:
Swift
Ergebnisse:
Swift 1.1
Swift 1.2
Swift 2.0
Scheint es zu sein, die gleiche Leistung, wenn ich kompilieren mit
-Ounchecked
.Swift 3.0
Scheint es eine performance regression von Swift 2.0 Swift 3.0, und ich bin auch zu sehen, einen Unterschied zwischen
-O
und-Ounchecked
für die erste Zeit.Swift 4.0
Swift 4 verbessert die Leistung wieder, wobei eine Lücke zwischen
-O
und-Ounchecked
.-O -whole-module-optimization
offenbar nicht um einen Unterschied zu machen.C++
Ergebnisse:
Apple Clang 6.0
Apple Clang 6.1.0
Apple Clang 7.0.0
Apple Clang Version 8.0.0
Apple Clang 9.0.0
Urteil
Als der Zeitpunkt des Schreibens dieses Artikels, Swift sort ist schnell, aber noch nicht so schnell wie C++'s Art bei der Kompilierung mit
-O
mit den oben genannten Compiler & Bibliotheken. Mit-Ounchecked
erscheint es so schnell wie C++ in Swift 4.0.2 und Apple LLVM 9.0.0.Vom
The Swift Programming Language
:Den
sort
- Funktion hat zwei Erklärungen.Die Standard-Erklärung, in der Sie angeben können, ein Vergleich Schließung:
Und eine zweite Erklärung, die nur einen einzigen parameter (das array) und ist "hardcoded zu verwenden, die weniger-als Komparator."
Getestet habe ich eine modifizierte version des Codes in einen Spielplatz mit der Schließung Hinzugefügt, so konnte ich monitor die Funktion ein wenig näher, und ich fand, dass mit n auf 1000 festgelegt, die Schließung aufgerufen wurde über 11.000 mal.
Es ist nicht eine effiziente Funktion, ein ich würde empfehlen, eine bessere Implementierung der Funktion.
EDIT:
Nahm ich einen Blick auf die Quicksort-wikipedia-Seite und schrieb eine schnelle Umsetzung für Sie. Hier ist das vollständige Programm, das ich verwendet (auf einem Spielplatz)
Mit diesem mit n=1000, fand ich, dass
Scheint es, dass die eingebauten sort-Methode ist (oder nahe zu) schnellen Sorte, und die ist wirklich langsam...
2*n*log(n)
. Das ist 13815 Vergleiche für das Sortieren von n = 1000 Elemente, so dass, wenn der Vergleich-Funktion wird aufgerufen über 11000 mal, die scheint nicht so schlecht.log(n)
für die Algorithmische Komplexität konventionell bezieht sich auf log-Basis-2. Der Grund für die nicht-Angabe der Basis ist, dass die change-of-base-Gesetz für Logarithmen stellt nur einen Konstanten Multiplikator, der verworfen wird, für die Zwecke von O-notation.C(n) = 2n ln n ≈ 1.39n log₂ n
. Für n = 1000 das gibt C(n) = 13815, und es ist nicht "big-O-notation".Als Xcode-7 können Sie aktivieren
Fast, Whole Module Optimization
. Dies sollte steigern Sie Ihre Leistung sofort.Swift-Array-Leistung revisited:
Schrieb ich meine eigene benchmark-Vergleich von Swift mit C/Objective-C. Mein benchmark berechnet Primzahlen. Es verwendet das array der vorherigen Primzahlen zu suchen, die wichtigsten Faktoren in jedem neuen Kandidaten, so dass es ganz schnell. Jedoch, es hat TONNEN von array Lesen und weniger schreiben-arrays.
Ich ursprünglich diesen benchmark gegen Swift 1.2. Ich beschlossen, aktualisieren Sie das Projekt und führen Sie es gegen Swift 2.0.
Dem Projekt können Sie wählen zwischen der Verwendung von normalen swift-arrays und mittels Swift-unsicher-Speicher-Puffer mit dem array-Semantik.
C/Objective-C, können Sie entweder entscheiden, zu verwenden NSArrays, oder C malloc ' ed arrays.
Die test-Ergebnisse scheinen ziemlich ähnlich wie mit den schnellsten, kleinsten code-Optimierung ([-0]) oder Schnellste, aggressiv ([-0fast]) - Optimierung.
Swift-2.0-Leistung ist immer noch schrecklich mit code-Optimierung ausgeschaltet, während C/Objective-C die Leistung ist nur mäßig langsamer.
Die Quintessenz ist, dass C malloc würd array-basierten Berechnungen sind die schnellsten, indem Sie eine bescheidene Marge
Swift mit unsicheren Puffer nimmt rund 1,19 X - 1.20 X länger als C malloc würd arrays bei der Verwendung Schnellste, kleinste code-Optimierung. der Unterschied scheint etwas weniger schnelle, aggressive Optimierung (Swift braucht mehr wie 1,18 x auf 1,16 x länger als C.
Wenn Sie regelmäßig Swift-arrays, der Unterschied zu C ist leicht größer. (Swift braucht ~1.22 1.23 länger.)
Regulären Swift-arrays sind
DRAMATICALLY
schneller als Sie waren im Swift 1.2/Xcode 6. Ihre Leistung ist so nah an Swift unsicher Puffer-basierten arrays, die mit unsicheren Speicher Puffer scheint nicht wirklich lohnt sich die Mühe nicht mehr, die ist groß.BTW, Objective-C-NSArray Leistung stinkt. Wenn du gehst, um die nativen container-Objekte in beiden Sprachen, der Swift ist DRAMATISCH schneller.
Können Sie check out my Projekt auf github an SwiftPerformanceBenchmark
Es hat eine einfache Benutzeroberfläche, macht das sammeln stats ziemlich einfach.
Es ist interessant, dass die Sortierung scheint etwas schneller in Swift als in C nun aber, dass diese Primzahl-Algorithmus immer noch schneller in Swift.
Die wichtigste Frage, die erwähnt wird, von anderen aber nicht rief genug ist, dass
-O3
tut überhaupt nichts in Swift (und auch nie hat), so dass bei der Kompilierung mit, dass es effektiv nicht-optimierte (-Onone
).Option Namen geändert haben im Laufe der Zeit so einige andere Antworten haben obsolete flags für den build-Optionen. Richtige aktuelle Optionen (Swift 2.2) sind:
Ganze Modul Optimierung langsamer kompilieren, aber optimieren kann zwischen Dateien innerhalb des Moduls, D. H. innerhalb der einzelnen Rahmen und innerhalb der eigentlichen Anwendungs-code, der aber nicht zwischen Ihnen. Sie sollten dies verwenden, für alles was performance kritisch)
Können Sie auch deaktivieren Sie Sicherheits-checks für noch mehr Geschwindigkeit, aber mit allen Behauptungen und Voraussetzungen, nicht nur Behinderte, sondern optimiert auf der Grundlage, dass Sie korrekt sind. Wenn Sie jemals getroffen, eine Behauptung dies bedeutet, dass Sie in ein Undefiniertes Verhalten. Verwenden Sie mit äußerster Vorsicht und nur, wenn Sie feststellen, dass die Geschwindigkeit zu steigern, lohnt sich für Sie (durch testen). Wenn Sie finden es wertvoll für den code empfehle ich die Trennung, die code in einem separaten Rahmen und nur das deaktivieren der Sicherheit-Prüfungen für das Modul.
Dies ist mein Blog über das Quick-Sort- Github-Beispiel Quick-Sort
Können Sie einen Blick über Lomuto ist Partitionierungs-Algorithmus in der Partitionierung der Liste. Geschrieben in Swift
Swift 4.1 führt neue
-Osize
Optimierung-Modus.Weiter Lesen : https://swift.org/blog/osize/