Swift – So messen Sie die Laufzeit einer Funktion/Funktion

Wenn wir die Leistung des Programms testen müssen, kann die mit Xcode gelieferte Testfunktion manchmal unsere Anforderungen nicht erfüllen. Zu diesem Zeitpunkt müssen wir den Testcode selbst schreiben. Leistungstests dienen hauptsächlich dazu, die Laufzeit von Programmen oder Codes zu testen. Unabhängig davon, ob CPU-/GPU-intensive Programme oder lese-/schreibintensive Programme getestet werden, ist es zur Berechnung der Leistung erforderlich, die Laufzeit von Programmen oder Funktionen zu ermitteln.

Wenn Sie ein CLI-Programm (Command Line Interface, Befehlszeileninteraktion) testen, können Sie bei der Verwendung des Programms Befehle hinzufügen, timeum die Laufzeit des gesamten Programms zu ermitteln. Wenn Sie jedoch die Laufzeit einer bestimmten Funktion im Programmcode oder beim Testen des GUI-Programms testen möchten, funktioniert diese Methode nicht. Wir müssen dem Code einen „Timer“ hinzufügen, um die Messarbeiten selbst zu organisieren.

Es gibt zwei Möglichkeiten, diese Messung in Swift zu implementieren: Die erste ist bequemer, kann aber nur auf neuen Systemen verwendet werden, die zweite ist kompatibler, aber nicht sicher (etwas weniger genau, aber vernachlässigbar).

Einfache Möglichkeit für neue Systememeasure

Allerdings hat Apple ab iOS 16 und macOS 13 neue Datenstrukturen Clockund ContinuousClockMethoden hinzugefügt measure, mit denen sich die Laufzeit einer Funktion testen lässt.

messenOffizielles Dokument

Es ist auch sehr einfach zu bedienen.

Zuerst Beispiel eins ContinuousClock:

let clock = ContinuousClock()

Verwenden Sie dann die folgende Anweisung, um die Laufzeit einer Funktion zu ermitteln:

let elapsed = clock.measure {
    
    
	someWork()
}

Hierbei ist zu beachten, dass letdie Verwendung zwingend erforderlich ist und Sie eine Variable nicht vorher deklarieren und dann hier instanziieren können.

Der hier erhaltene Typ elapsedmuss ContinuousClock.Instant.Durationzur Verwendung in eine Zeichenfolge konvertiert werden. Die Konvertierungsmethode lautet wie folgt:

var duration: String = ""
let elapsed = clock.measure {
    
    
	quicksort()
}
//elapsed.description是字符串类型
duration = elapsed.description

Der Gesamtcode lautet:

struct ContentView: View {
    
    
    var clock = ContinuousClock()
    @State private var duration: String = ""
    var body: some View {
    
    
        VStack {
    
    
            Text("点击按钮进行快速排序测试:")
                .padding()
                
            Button(action: {
    
    
            	//获取时间间隔,也就是运行时间
                let elapsed = clock.measure {
    
    
                	//测试函数为‘quicksort’
                	quicksort()
                }
                //把获取到的时间间隔转换成字符串
                duration = elapsed.description
            }) {
    
    
                Text("Start")
            }
            .padding()

			// 显示时间,由于elapsed.description最后自带字符串“second”,所以不用加单位
            Text("消耗时间为:\(duration)")
                .padding()
        }
        .padding()
    }
}

So sieht es in der App aus:

Beim Ausführen in der App

Gängige Methode

Wenn es sich nicht um das neueste System handelt oder Sie verwandte Methodenfunktionen selbst schreiben möchten, können Sie die klassische Methode verwenden: Zeitdifferenz. Notieren Sie die Start- und Endzeit und ermitteln Sie dann die Differenz, um die Laufzeit zu erhalten.

Worauf basiert diese Zeit? Die C-Sprache ist die Uhrzeit, aber Swift verfügt seit iOS 16 nur noch über die Uhrzeit und Datetippt davor nur. Glücklicherweise kann Date unseren Zweck erreichen, indem wir timeIntervalSince1970einfach den darin enthaltenen Wert verwenden.

timeIntervalSince1970Dieser Wert ist ein sehr historischer Wert, und alle Systeme (nicht nur die von Apple) haben diesen Wert, da 1970 die Startzeit des ersten weit verbreiteten Unix-Systems ist und die Aufzeichnungen von 1970 bis 01.01.00:00 Uhr stammen timeIntervalSince1970: 00 kann die Genauigkeit den Dezimalpunkt erreichen und für die zu diesem Zeitpunkt verstrichene Zeit Millisekunden (oder sogar weniger, ähnlich der Genauigkeit der vorherigen Methode) erreichen.

Da der Unterschied zur vorherigen Methode nur teilweise besteht, wird der Gesamtcode direkt aufgelistet:

struct ContentView: View {
    
    
    @State private var duration: String = ""
    var body: some View {
    
    
        VStack {
    
    
            Text("点击按钮进行快速排序测试:")
                .padding()
            Button(action: {
    
    
            	//记录开始时间
                let start_time = Date().timeIntervalSince1970
                //开始运行被测试函数
                quicksort()
                //记录结束时间
                let end_time = Date().timeIntervalSince1970
                //做差获取间隔时间,并且将其变成字符串格式
                duration = TimeInterval(end_time-start_time).description
            }) {
    
    
                Text("Start")
            }
            .padding()

			//由于这个方法没有带单位,所以自己加一个“seconds”
            Text("消耗时间为:\(duration) seconds")
                .padding()
        }
        .padding()
    }
}

Der Operationseffekt ist genau der gleiche wie bei der vorherigen Methode und wird daher nicht aufgeführt.

Ich hoffe, den Bedürftigen helfen zu können

Acho que você gosta

Origin blog.csdn.net/qq_33919450/article/details/129916722
Recomendado
Clasificación