2015-09-11 11 views
6

Ich lerne Instrumente, also habe ich eine einfache App erstellt, mit der der Benutzer eine Anzahl von Megabyte (MB) eingeben kann. Und ich verwende das Tool "Zuweisungen" in Instruments, um sicherzustellen, dass diese genaue Datenmenge zugewiesen wird. Ich sehe jedoch immer mehr Speicher in den Instrumenten als ich erwarte.Zuweisung bestimmter Speichermenge in Swift - iOS

Ich habe die folgende

func allocateMemoryOfSize(numberOfBytes: Int) { 

    var bytesArray = [Int8]() 
    for i in 0 ..< numberOfBytes { 
     bytesArray.append(Int8(i % 7)) 
    } 
} 

ich mit vielen Fragen, und ich fand eine Alternative geprüft:

func allocateMemoryOfSize(numberOfBytes: Int) { 
     var imageData = UnsafeMutablePointer<Int8>.alloc(numberOfBytes)} 

Aber ich habe noch mehr Speicher zugewiesen bekommen. Hier ist die restults in Instruments, wenn ich 10 MBs zuteilen:

Vor der allocateMemoryOfSize Funktion ausgeführt wird:

Before: only 20.58 MB used

Während der Lauf der Funktion: 44,96 MB verwendet During: 44.96 MB used

Nach dem Laufen der Funktion: zurück zu nur 20,58 MB After: back to only 20.58 MB

Also die Funktion allocat es ist ungefähr 22 MBs nicht 10 wie gewünscht. Was mache ich falsch? oder ist das extra Speicherverwaltung Zeug?

Antwort

6

Im ersten Fall, wenn Sie Bytes intern an Ihr Array anhängen, wird die Neuzuweisung verwendet, wenn kein freier Speicherplatz vorhanden ist. Diese Neuzuweisung verdoppelt normalerweise die aktuelle Array-Größe. Hier ist, wie es aussieht:

enter image description here

Sie sehen, dass die Zuteilung mit einigen zusätzlichen Raum durchgeführt wurde.

Wenn wir Sie ändern Funktionsspeicher vorzubelegen:

func allocateMemoryOfSize(numberOfBytes: Int) { 
    buffer = [UInt8](count: numberOfBytes, repeatedValue: 0) 
    for i in 0 ..< numberOfBytes { 
     buffer[i] = UInt8(i % 7) 
    } 
} 

Wir können das sehen:

enter image description here

Update # 1

Allocation mit unsicheren Zeiger arbeiten. Hauptnachteil ist das manuelle Speichermanagement: Sie müssen es explizit freigeben.

Über Zuweisungszusammenfassung: Wenn Sie Speicher reservieren, passieren auch einige Systemzuweisungen. In meinem Screenshot konnte man sehen, dass nicht nur 10 Megabyte mit Anrufer swift.slowAlloc sondern auch 8 Megabyte mit Anrufer _dispatch_alloc_try_create_heap belegt sind. Sie sehen also im Diagramm, dass die App 18 Megabyte anstelle von 10 verwendet. Ich weiß nicht, warum diese Systemzuordnung auch passiert, weil es sich um iOS-Interna handelt. Ich denke, Sie müssen nur auf Ihre Zuweisungen achten. In meinem Beispiel sehe ich, dass 10 Megabytes angefordert und App gegeben wurden.

+0

Vielen Dank, John! Ich habe nur ein paar Kommentare: 1- es funktionierte, als ich die for-Schleife löschte, als ich 10MBs eingab, es gab genau 10 MB zu. Mit der for-Schleife wurden ungefähr 15MBs zugewiesen. Wahrscheinlich hat die for-Schleife auch etwas Speicher benötigt. Also, ich schlage vor, Sie entfernen die for-Schleife aus Ihrer Antwort. 2- Ich verstehe Ihre Erklärung für die Array-Zuweisung, aber warum hat der unsichere veränderbare Array-Aufruf mehr Speicher zugewiesen? Danke vielmals! – CSawy

+0

Ich denke, dass for-Schleife die Zuordnung nicht beeinflusst. Ich habe meine Antwort mit einer Erläuterung der Zuordnungszusammenfassung aktualisiert. –

0

Ich tat dies:

static var buffer = [UInt8]() 
static func allocateMemoryOfSize(numberOfMegaBytes: Int) { 
    print("Allocating \(numberOfMegaBytes)MB of memory") 
    let mb = 1048576 
    let newBuffer = [UInt8](count: numberOfMegaBytes * mb, repeatedValue: 0) 
    buffer += newBuffer 
} 
+0

kann nicht helfen, aber darüber nachdenken, wie viel ich liebe Pascal: var Daten: PByte; Daten: = AllocMem (SomeByteSize); ZeroMemory (Daten, einigeByteSize); :) –

0

Swift 3.1:

static var buffer = [UInt8]() 

static func allocateMemoryOfSize(numberOfMegaBytes: Int) { 
    print("Allocating \(numberOfMegaBytes)MB of memory") 
    let mb = 1048576 
    let newBuffer = [UInt8](repeating: 0, count: numberOfMegaBytes * mb) 
    buffer += newBuffer 
}