13 votos

Medir los tiempos de carga de proyectos de QGIS

Para QGIS ya existe un método para medir los tiempos de carga de los complementos (qgis.utils.plugin_times):

¿Cómo saber qué complementos de QGIS tardan mucho en cargar?

¿Existe algo similar para medir los tiempos de carga de las partes de un proyecto QGIS (capas, diseñador ...)?

Encontré algo en la parte cpp (qgsbench.cpp) https://github.com/qgis/QGIS/blob/530397c1683cc787ef90bc27e2d958779ed0d754/tests/bench/qgsbench.cpp así que quizás también haya una forma de medir las cosas con python/pyqgis.

5voto

BWW Puntos 302

Una respuesta para QGIS 3.16 (no probado en versiones anteriores)

Tienes 3 grupos posibles en el perfilador en este momento en QGIS (inicio, cargadeproyecto, renderizado). Debes tener en cuenta que ahora hay un widget con el contenido del perfilador (ver captura de pantalla)

Interfaz gráfica de usuario de QGIS con panel para perfilador mostrado

Para obtener la lista actual de grupos utilizados, haz QgsApplication.profiler().groups()

Para obtener el tiempo de todas las mediciones existentes (por defecto o las tuyas propias)

perfilador = QgsApplication.profiler()
for grupo in perfilador.groups():
    nombreGrupoTraducido = perfilador.translateGroupName(grupo)
    for hijo in perfilador.childGroups('', grupo):
        valor = perfilador.profileTime(hijo, grupo)
        grupoHijo = perfilador.childGroups(hijo, grupo)
        # grupo = nombre en el combobox de la GUI pero amigable para humanos
        # hijo = nombre de la primera columna
        # Tiempo de ejecución
        print(nombreGrupoTraducido, hijo, valor)
        if len(grupoHijo) > 0:
            for subGrupo in grupoHijo:
                print(subGrupo, perfilador.profileTime(subGrupo, grupo))

# Cosa rara aquí = el orden al recorrer difiere del que se muestra en la GUI...

# Para el tiempo global por grupo, en teoría, deberías hacer lo siguiente
# pero no funciona (retorna 0.0)
# En cambio, puedes sumar valores en el bucle anterior para obtener el tiempo total "correcto"
for grupo in perfilador.groups():
    print(grupo, perfilador.totalTime(grupo))

Si quieres tus propias medidas con tu propio grupo

from time import sleep
perfilador = QgsApplication.profiler()

perfilador.start('nombre de tu tarea 1', 'nombre de tu nuevo grupo')
# Para simular tiempo de espera pero normalmente, ejecutas tu código personalizado
sleep(11.0)
perfilador.end('nombre de tu nuevo grupo')

perfilador.start('nombre de tu tarea 2', 'nombre de tu nuevo grupo')
# Para simular tiempo de espera pero normalmente, ejecutas tu código personalizado
sleep(8.0)
perfilador.end('nombre de tu nuevo grupo')

# Forma alterna de evitar start y end usando contexto de Python
# Desventaja: no puedes registrar en tu propio grupo sino solo en el grupo de inicio (por defecto)
with QgsRuntimeProfiler.profile('qwerty'):
    sleep(2)
    # Hacer algo

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X