2017-10-02 7 views
0

Ich testete meinen Code in Playground, aber wie die Diskussion darauf hinweist, dass Playground Debug Konfiguration ist, sobald ich alle diese Code in Real-App läuft, machen sie keinen großen Unterschied. Ich weiß noch nichts über diese Debug/Release-Sache.Warum ist dieser For-Schleife-Ansatz verglichen mit dem Map-Ansatz so langsam?

Schnelle Leistungsbezogene Frage, ich muss den Pixel-Offset von Bildern durchlaufen, zuerst habe ich es auf diese Weise versucht.

func p1() -> [[Int]]{ 
    var offsets = [[Int]]() 
    for row in 0..<height { 
     var rowOffset = [Int]() 
     for col in 0..<width { 
      let offset = width * row + col 
      rowOffset.append(offset) 
     } 
     offsets.append(rowOffset) 
    } 
    return offsets 
} 

Aber es ist sehr langsam, ich gesucht und einige Code-Schnipsel Schleife durch Offset diese Weise gefunden:

func p2() -> [[Int]]{ 
    return (0..<height).map{ row in 
     (0..<width).map { col in 
      let offset = width * row + col 
      return offset 
     } 
    } 
} 

Also testete ich, wenn ich Funktion p1 und p2 eine Schleife durch height = 128 und Breite = 128 Bild, p1 ist 18 mal langsamer als p2, warum p1 ist so langsam im Vergleich zu p2? Ich frage mich auch, gibt es einen anderen schnelleren Ansatz für diese Aufgabe?

Antwort

1

Der offensichtlichste Grund, warum der map Ansatz schneller ist, ist, weil map die Array-Kapazität im Voraus reserviert (da es weiß, wie viele Elemente im resultierenden Array sein werden). Sie können dies auch in Ihrem Code tun, indem Sie ary.reserveCapacity(n) auf Ihren Arrays, z.

func p1() -> [[Int]]{ 
    var offsets = [[Int]]() 
    offsets.reserveCapacity(height) // NEW LINE 
    for row in 0..<height { 
     var rowOffset = [Int]() 
     rowOffset.reserveCapacity(width) // NEW LINE 
     for col in 0..<width { 
      let offset = width * row + col 
      rowOffset.append(offset) 
     } 
     offsets.append(rowOffset) 
    } 
    return offsets 
} 
+0

Danke, durch diese es sich verbessert, aber nur ein wenig, Karte noch gewinnt überwiegend – XueYu

+0

@XueYu testen Sie in Debug oder Release-Konfiguration mit? Die 'map'-Version wird in beiden schnell sein, da die stdlib mit Optimierungen kompiliert wird, aber Ihre benutzerdefinierte Version wird in Release viel schneller sein als in Debug. –

+0

Ich mache einfach einen sehr einfachen Test im Spielplatz, benutze CACurrentMediaTime(), um die verwendete Zeit anzuzeigen. – XueYu