2014-09-27 7 views
7

Gibt es eine Möglichkeit, die Ausführungsgeschwindigkeit eines Spielplatzes zu erhöhen? Ich möchte viele Zyklen durchlaufen und nicht 10 Minuten warten.Swift Spielplatz Ausführung Geschwindigkeit

Zum Beispiel:

import UIKit 

var count = 0 
for var i = 0; i < 1000000000; i++ { 
    count++ 
} 

Dieser Code wird eine Art und Weise zu lang auszuführen. Aber ich will schnelles Ergebnis bekommen.

+0

Vielleicht würde ein optimierender Compiler diesen Code reduzieren auf: 'var count = 1000000000'. – zaph

+0

@Zaph Versuchen Sie, diesen Code auf den Spielplatz zu kopieren, und Sie werden sehen, was ich meine. – zakhej

+1

Warum wählen Leute für nahe? Weißt du nicht, was ist ein Spielplatz? – zakhej

Antwort

3

Ich fühle deinen Schmerz, ich spielte mit dem Drucken von 2D-Funktionen um [Double] dann Umwandlung in UIImageView. Einer der Schritte bestand darin, über Millionen von Pixeln zu iterieren, und es dauerte ewig.

Alles, was rechenintensiv oder sich wiederholend oder möglicherweise zeitaufwändig ist, sollte in den Ordner "Quellen" des Spielplatzes gelegt werden. Auf diese Weise wird der Code vor der Ausführung Ihres Spielplatzes vorkompiliert. Setzen Sie die Ausgabe dieser for Schleife in eine öffentliche Funktion, die Sie vom Spielplatz aufrufen können. Dann müssen Sie nicht mehr dort sitzen und den Spielplatz zählen, wenn er durch die for Schleife gegangen ist.

0

Ich hatte ein solches Problem und ich habe es nach Tagen der Versuche gelöst. Alles, was ich tun musste, ist, meinen gesamten Code in den Ordner Sources von playground zu verschieben. Also, danach wurde die Ausführungsgeschwindigkeit verbessert. Ich hoffe es hilft dir.

Hinweis: Vergessen Sie nicht, offene Klassen zu verwenden.

2

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):

  1. 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) 
    } 
    
  2. Variablen initialisieren und separat deklarieren.

    var x: Int // NO output 
    (x = 0) // NO output 
    
  3. 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] 
    
  4. 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):

  1. return s in Funktionen und Verschlüsse
  2. 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 !!!

Verwandte Themen