7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. Go

Hacer Su Programas Vayan Rápido Como un Relámpago con Perfiles

Read Time: 12 mins

Spanish (Español) translation by James (you can also view the original English article)

Go se utiliza a menudo para escribir sistemas distribuidos, almacenes de datos y microservicios avanzados. El rendimiento es clave en estos dominios.

En este tutorial, aprenderás cómo tus programas para que sean de perfil rayo rápido (utilizar mejor la CPU) o la pluma de luz (uso de menos memoria). Cubriré de CPU y memoria de perfiles, utilizando lo pprof (analizador de Go), visualizar los perfiles y llama incluso gráficos.

Perfiles es medir el rendimiento de su programa en distintas dimensiones. Go viene con un gran apoyo para elaboración de perfiles y pueden perfil las siguientes dimensiones de la caja:

  • un muestreo de tiempo de CPU por instrucción y la función
  • una muestra de todas las asignaciones de montón
  • trazas de pila de todos goroutines actuales
  • trazas de pila que condujeron a la creación de nuevos hilos de OS
  • trazas de pila que condujeron a bloqueo en primitivas de sincronización
  • trazas de pila de los titulares de las exclusiones mutuas de contendio

Usted puede incluso crear perfiles personalizados si desea. Vaya perfiles de involucra la creación de un archivo de perfil y luego analizar con lo pprof vaya herramienta.

Cómo Crear Archivos de Perfil

Hay varias formas de crear un archivo de perfil.

Usando "go test" para Generar Archivos de Perfil

La forma más fácil es utilizar go test. Cuenta con varias banderas que permiten crear archivos de perfil. Aquí es cómo generar un archivo de Perfil de CPU y un archivo de Perfil de memoria para la prueba en el directorio actual: go test -cpuprofile cpu.prof -memprofile mem.prof -bench .

Descargar Datos en el Perfil de un Servicio de Larga

Si usted desea un servicio de web de larga duración de perfil, puede utilizar la interfaz HTTP integrada para proporcionar datos de perfil. Añadir en alguna parte la siguiente declaración de importación:

import _ "net/http/pprof"

Ahora, puede descargar los datos del perfil vivo de /debug/pprof/ URL. Más información está disponible en la documentación del paquete net/http/pprof.

Perfiles en el Código

También puede agregar perfiles directamente en el código para el control completo. Primero necesitará importar runtime/pprof. Perfiles de la CPU está controlada por dos llamadas:

  • pprof.StartCPUProfile()
  • pprof.StopCPUProfile()

Perfiles de memoria se realiza llamando runtime.GC() seguido por pprof.WriteHeapProfile().

Todas las funciones de generación de perfiles aceptan un identificador de archivo que usted es el responsable de apertura y cierre adecuadamente.

El Programa de Ejemplo

Para ver el generador de perfiles en acción, utilizo un programa que soluciona Problem 8 de proyecto Euler. El problema es: dado un número de 1.000 dígitos, encontrar los 13 dígitos adyacentes dentro de este número que tienen el producto más grande.

Aquí es una solución trivial que recorre en iteración todas las secuencias de 13 dígitos, y para cada tal secuencia multiplica todos los 13 dígitos y devuelve el resultado. El resultado mayor es almacenado y finalmente volvió:

Más tarde, después de perfilar, veremos algunas maneras de mejorar el rendimiento con otra solución.

Perfiles de CPU

Vamos a perfil la CPU de nuestro programa. Usaré el método de ir prueba con este test:

Tenga en cuenta que realizar la prueba de 100.000 veces porque el analizador ir es un generador de perfiles de muestreo que necesita el código de dedicar un tiempo significativo (acumulados varios milisegundos) en cada línea de código. Aquí está el comando para preparar el perfil:

Tomó un poco más 13 segundos (100.000 iteraciones). Ahora, para ver el perfil, uso lo pprof ir herramienta para entrar en el símbolo del sistema interactivo. Hay muchos comandos y opciones. El comando más básico es topN; con el -cum opción muestra las funciones top N que tuvo el tiempo más acumulado a ejecutar (para una función que toma muy poco tiempo para ejecutar, pero es llamado muchas veces, puede ser en la parte superior). Esto es generalmente lo que empiezo.

Entendamos la salida. Cada fila representa una función. Omite la ruta de acceso a cada función por limitaciones de espacio, pero se mostrará en el real de la salida como la última columna.

Plana: el tiempo (o porcentaje) pasó dentro de la función y Cum significa acumulativo — el tiempo pasado dentro de la función y todas las funciones llamadas. En este caso, testing.tRunner llama TestFindLargestProduct(), que se llama FindLargestProduct(), pero ya casi no es el tiempo allí, el generador de perfiles muestreo cuenta su tiempo plana como 0.

Perfiles de Memoria

Perfiles de memoria es similar, excepto que se crea un perfil de memoria:

Puede analizar su uso de memoria utilizando la misma herramienta.

Utilizando pprof Para Optimizar la Velocidad de su Programa

Vamos a ver qué podemos hacer para resolver el problema más rápido. Mirar el perfil, vemos que calcProduct() toma 8.17% de ejecución plana, sino makeSlice(), que se llama de calcProduct(), es 72% (acumulativo porque llama a otras funciones). Esto da una indicación bastante buena de lo que tenemos que optimizar. ¿Qué hace el código? Para cada secuencia de 13 números adyacentes, asigna una rebanada:

Que es casi 1.000 veces por carrera, y podemos correr 100.000 veces. Asignaciones de memoria son lentas. En este caso, no hay realmente para asignar un nuevo segmento cada vez. En realidad, no hay necesidad de asignar cualquier rebanada en todo. Sólo podemos analizar la matriz de entrada.

Fragmento de código siguiente muestra cómo calcular el producto corriente simplemente dividiendo la primera cifra de la secuencia anterior y multiplicando por la cifra de cur.

Aquí está una lista corta de algunas de las optimizaciones algorítmicas:

  • Computación un producto corriente. Supongamos que hemos calculado el producto Índice N.... N+13 y llamarlo P(N). Ahora tenemos que calcular el producto en el índice de N+1+13. P(N+1) es igual a p (n) salvo que el primer número en el índice N se ha ido y tenemos que tener en cuenta el nuevo número de índice N+14T. Esto se puede hacer dividiendo el producto anterior de su primer número y multiplicando por el número de nuevos.
  • Informática no cualquier secuencia de 13 números que contengan 0 (el producto siempre será cero).
  • Evitar la división o multiplicación por 1.

El programa completo está aquí. Hay cierta lógica Espinosa a trabajar alrededor de los ceros, pero aparte de que es bastante sencillo. Lo principal es que asignamos sólo una matriz de 1000 bytes al principio, y pasamos por el puntero (sin copia) a la función findLargestProductInSeries() con una gama de índices.

La prueba es el mismo. Vamos a ver cómo lo hicimos con el perfil:

Del palo, podemos ver que el tiempo de ejecución se redujo de más de 13 segundos a menos de un segundo. Eso es bastante bueno. Tiempo para dar un vistazo dentro. Vamos a usar solo el top10 de la AML, que ordena por tiempo plano.

Esto es genial. Bastante el tiempo de ejecución total se gasta dentro de nuestro código. No hay asignaciones de memoria en absoluto. Podemos bucear más profundo y mirar el nivel de instrucción con el comando list:

Esto es bastante sorprendente. Tienes un tiempo por la declaración de todos los puntos importantes. Tenga en cuenta que la llamada en la línea 73 a función f() es realmente una llamada a findLargestProductInSeries(), que me cambió de nombre en el perfil debido a limitaciones de espacio. Esta llamada lleva ms de 20. Tal vez, incrustando el código de función en su lugar, podemos ahorrar la llamada de función (incluyendo asignación de pila y copia de argumentos) y guardar los 20 ms. puede haber otras optimizaciones que vale la pena que este punto de vista puede ayudar a ubicar.

Visualización

Mirando estos perfiles de texto puede ser difícil para los grandes programas. Go le ofrece un montón de opciones de visualización. Usted necesitará instalar Graphviz para la siguiente sección.

La herramienta pprof puede generar salida en varios formatos. Una de las formas más sencillas (salida svg) es simplemente teclear 'web' desde el símbolo del sistema interactivo pprof, y el navegador mostrará un bonito gráfico con la caliente ruta marcada en color rosa.

VisualizationVisualizationVisualization

Gráficos de Llama

Los gráficos integrados son agradable y servicial, pero con grandes programas, incluso estos gráficos pueden ser difíciles de explorar. Una de las herramientas más populares para visualizar resultados de rendimiento es el gráfico de llama. La herramienta pprof no lo apoya fuera de la caja todavía, pero se puede jugar con gráficos llama ya con herramienta de go-torch de Uber. Hay trabajos en curso para agregar soporte para gráficos llama a pprof.

Conclusión

Es un sistemas de programación de lenguaje que se utiliza para construir tiendas distribuidas de datos y sistemas de alto rendimiento. Go viene con un excelente apoyo que se pone cada vez mejor para perfilar sus programas, analizar su rendimiento y visualizar los resultados.

Hay mucho énfasis por el equipo de Go y la comunidad en la mejora de las herramientas de rendimiento. El código de fuente completo con tres diferentes algoritmos puede encontrarse en GitHub.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Scroll to top
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.