Einer der größten Performance-Mörder ist der Ausgang auf der rechten Seite des Spielplatzes. Jetzt zeige ich Ihnen, wie Sie diese Ausgabe minimieren können.
Siehe am Ende für Ihren Beispielcode.
Bestleistung
Die performant ist, die gesamte Leistung kritischen Code in einer .swift
Datei im Sources
Ordner auf dem Spielplatz zu machen.
Hinweis: Um die Funktionen, Klassen, Eigenschaften und Methoden aus dem Sources
Ordner, den Sie sie public
markieren haben zu verwenden. Wenn Sie eine Klasse ableiten wollen, muss sie mit open
markiert werden.
gute Leistung, aber hässlich Code
Die folgende Methode (Ich denke, das ist nicht offiziell/intended) verwendet werden können, auf dem Spielplatz Ausgang zu deaktivieren, sondern führt auch zu hässlichen Code. Es ist jedoch gut, die Ausgabe vorübergehend zu deaktivieren.
Es gibt zwei Möglichkeiten (und zwei Tricks) die minimale Menge an Output zu erzielen (Wenn Sie einen besseren Weg finden, uns wissen lassen):
Verwenden Klammer um Void
(oder Void?
) Ausdrücke wie Zuordnungen (führt normalerweise zu keiner Ausgabe, siehe auch 3.).
var x = 0 // output: 0
(x = 1) // NO output
(x = 2 * x - 1) // NO output
(x.negate()) // NO output
Hinweis: In Swift eine Zuordnung gibt Void
und bei optional chaining ist es Void?
.
var x: (Int, Int)? = nil
if (x?.0 = 0) != nil {
// assignment was successful (x!=0 and now x=(0, x.1))
} else {
// assignment was not successful (x==nil)
}
Variablen initialisieren und separat deklarieren.
var x: Int // NO output
(x = 0) // NO output
wenn 1. funktioniert nicht eine zusätzliche no-op (keine Operation) Linie über oder unter ()
hinzuzufügen.
Dies geschieht in einzelnen Streckensperrungen (und wahrscheinlich auch in anderen Kontexten) zum Beispiel: (siehe auch den Code unten)
[1, 4, 5, 6].mmap{
() // without this line the line below would yield to an output
($1 = $0 + 1)
} as [Int]
Anstatt jede Zeile in Klammern der Verpackung können Sie auch ein Tupel verwenden von alle Ausdrücke, die dann einer variablen zugewiesen wird:
var a: Any // this may be a useful definition in this context
var x: Int
var y: Int
(a = (x = 0,
y = 1,
x = y + 1,
y = x*x))
Allerdings könnte dies zu einer Vertiefung einer Katastrophe führen ...
Wo es nicht funktioniert (Ich habe keine Möglichkeit gefunden, die Ausgabe zu entfernen; Diese Liste vollständig ist wahrscheinlich nicht):
return
s in Funktionen und Verschlüsse
- Erklärung
Optional
Variablen, zB: var x: Int?
Ein Beispiel für eine neue map
Methode auf Sequence
Verwendung: Siehe oben unter Punkt 3.
Die Signatur von Sequence.map
ist
func map<T>(_ transform: (Self.Element) throws -> T) rethrows -> [T]
Da ich keinen Weg, wie zu entfernen und die Ausgabe von return
s kann man einen Verschluss verwenden, um mit einem inout
Argument gefunden haben (die „Rückkehr“ Wert mit einer Zuordnung bekommen) . Eine mögliche Unterschrift könnte dann sein:
func mmap<U>(_ transform: (Element, inout U?) ->()) -> [U]
so können wir nil
im inout
Argumente übergeben, da es eine gute Vorgabe für jeden möglichen U
ohne Auferlegung eine Einschränkung für U
ist, die einen Instanz-Generator erforderlich machen könnte (zB: init() { ... }
) .
Leider hat Swfit es schwer, auf U
zu schließen, also müssten Sie dem Compiler mit expliziten Typ Anmerkungen helfen. Zusätzlich var newElement: U?
tut zurück nil
in der Seitenleiste.
Jetzt werde ich Any
anstelle von U?
:
extension Sequence {
// ATTENTION: this is not as performant as the normal `map`!
func mmap<U>(transform: (Element, inout Any) ->()) -> [U] {
var result: [U]
(result = [U]())
for element in self {
var newElement: Any
(newElement = 0) // some placeholder element
(transform(element, &newElement))
// assume the inout element to be of type `U`
(result.append(newElement as! U))
}
return result // the ONLY output in this method
}
}
Ihr Beispielcode
Mit Swift 4
var count = 0
for i in 0..<1_000_000_000 {
(count += 1)
if count % 100_000 == 0 {
// print only every 100_000th loop iteration
print(count)
}
}
Ohne die Klammer: ca. 10.000 Schleifendurchläufe pro Sekunde
Mit Klammern: ca. 10.000.000 Schleifeniterationen pro Sekunde !!!
Vielleicht würde ein optimierender Compiler diesen Code reduzieren auf: 'var count = 1000000000'. – zaph
@Zaph Versuchen Sie, diesen Code auf den Spielplatz zu kopieren, und Sie werden sehen, was ich meine. – zakhej
Warum wählen Leute für nahe? Weißt du nicht, was ist ein Spielplatz? – zakhej