Saltar al contenido

¿Cómo comparar la ejecución del código Swift?

Solución:

Si solo desea una función de temporización independiente para un bloque de código, utilizo las siguientes funciones auxiliares de Swift:

func printTimeElapsedWhenRunningCode(title:String, operation:()->()) {
    let startTime = CFAbsoluteTimeGetCurrent()
    operation()
    let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
    print("Time elapsed for (title): (timeElapsed) s.")
}

func timeElapsedInSecondsWhenRunningCode(operation: ()->()) -> Double {
    let startTime = CFAbsoluteTimeGetCurrent()
    operation()
    let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
    return Double(timeElapsed)
}

El primero cerrará la sesión el tiempo requerido para una determinada sección de código, y el segundo lo devolverá como un flotante. Como ejemplo de la primera variante:

printTimeElapsedWhenRunningCode(title:"map()") {
    let resultArray1 = randoms.map { pow(sin(CGFloat($0)), 10.0) }
}

cerrará sesión algo como:

Tiempo transcurrido para el mapa (): 0.0617449879646301 s

Tenga en cuenta que los puntos de referencia de Swift variarán en gran medida en función del nivel de optimización que seleccione, por lo que esto solo puede ser útil para comparaciones relativas del tiempo de ejecución de Swift. Incluso eso puede cambiar según la versión beta.

Si desea obtener información sobre el rendimiento de un determinado bloque de código y asegurarse de que el rendimiento no se vea afectado cuando realice ediciones, lo mejor sería utilizar las funciones de medición de rendimiento de XCTest, como measure(_ block: () -> Void).

Escriba una prueba unitaria que ejecute el método que desea comparar, y esa prueba unitaria la ejecutará varias veces, lo que le dará el tiempo necesario y la desviación de los resultados.

func testExample() {

    self.measure {
        //do something you want to measure
    }
}

Puede encontrar más información en los documentos de Apple en Pruebas con Xcode -> Pruebas de rendimiento.

Puede utilizar esta función para medir código asíncrono y síncrono:

import Foundation

func measure(_ title: String, block: (@escaping () -> ()) -> ()) {

    let startTime = CFAbsoluteTimeGetCurrent()

    block {
        let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
        print("(title):: Time: (timeElapsed)")
    }
}

Entonces, básicamente, pasa un bloque que acepta una función como parámetro, que usa para decirle a la medida cuándo terminar.

Por ejemplo, para medir cuánto tarda una llamada llamada “myAsyncCall”, la llamaría así:

measure("some title") { finish in
    myAsyncCall {
        finish()
    }
    // ...
}

Para código síncrono:

measure("some title") { finish in
     // code to benchmark
     finish()
     // ...
}

Esto debería ser similar a MeasuringBlock de XCTest, aunque no sé exactamente cómo se implementa allí.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *