No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Profiling

19/30
Recursos

Aportes 19

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Para evitar la fatiga

12586269025

Para ver el uso de CPU del codigo que testeamos, usamos

$ go test -cpuprofile=cpu.out

Para ver el resumen del uso del CPU:

$ go tool pprof cpu.out

Dentro de pprof escribimos top para ver como se han comportado los programas en nuestro test

(pprof) top

Además, dentro de pprof podemos inspeccionar el tiempo promedio de ejecución de cada línea de una función, usando el comando list <nombre_funcion>

(pprof) list Fibonacci

Tambien podemos ver el reporte del promedio de ejecución:

  • en el navegador usando web
  • o exportarlo en pdf usando pdf
(pprof) web
(pprof) pdf

Para salir de (pprof) puedes usar quit o Ctrl + D

Para los que estén en Mac OS pueden instalar Graphviz mediante HomeBrew

brew install graphviz

https://formulae.brew.sh/formula/graphviz

Para los que tengan el Error y estén en linux (basado en debian):

failed to execute dot. Is Graphviz installed? Error: exec: "dot": executable file not found in $PATH

Lo unico que deben de hacer es un:

$ sudo apt install graphviz

si al ejecutar (pprof) top se muestra:
.
Showing nodes accounting for 0, 0% of 0 total
flat flat% sum% cum cum%
.
Significa que la funcion se ejecuta con una carga muy baja para la cpu, osea la funcion tiene un muy buen rendimiento por lo que esta muy por debajo del umbral detectable por la herramienta pprof de go, osea como la funcion se ejecuta sin consumir mucha cpu entonces pprof no muestra la informacion de rendimiento de dicha funcion ya que no es necesario

Les comparto un articulo publicado en el blog de golang que trata sobre que es profiling y como se implementa y los usos a detalle
https://go.dev/blog/pprof

Esta implementación de Fibonacci es lenta principalmente porque calcula los valores de la sucesión dos veces, dentro de la pila de llamadas, se repite la función con los mismos argumentos. Una forma de mejorar el tiempo y llevarlo a prácticamente la mitad, es cambiar la recursión por un ciclo. Haciendo las sumas de menor a mayor, en lugar de mayor a menor.

func ComputeOnceFibonacci(n int) int {
	size := math.Max(2, float64(n+1))
	values := make([]int, size)
	values[0] = 0
	values[1] = 1

	for i := 2; i <= n; i++ {
		values[i] = values[i-1] + values[i-2]
	}

	return values[n]
}

Go es increíble

por si estan usando ubuntu wsl usando el comando
go tool pprof -http=:xxxx cpu.out pueden acceder desde el navegador del host (reemplazar por puerto a gusto y revisar que su IIS no este usando ese puerto jajaja)

Estas herramientas están OP. Go está potente,

Aqui una version del fib, de manera iterativa 😄

func Fibonacci(n int) int {
	fib := make([]int, n+1)
	fib[0] = 0
	fib[1] = 1
	for i := 2; i <= n; i++ {
		fib[i] = fib[i-1] + fib[i-2]
	}
	return fib[n]
}

les funciono go test -cpuprofile=cpu.out? me sale esto no required module provides package .out; to add it: go get .out ya hice un winget install graphviz
func TestFib(t \* testing.T) { tables: = \[] struct { a int n int } { { 1, 1 }, { 8, 21 }, { 50, 12586269025 }, } for \_, item: = range tables { fib: = Fibonacci(item.a) if fib != item.n { t.Errorf("Fibonacci was incorrect, got %d, expected %d", fib, item.n) } } }
func TestFib(t \*testing.T) {    tables := \[]struct {        a int        n int    }{        {1, 1},        {8, 21},        {50, 12586269025},    }     for \_, item := range tables {        fib := Fibonacci(item.a)        if fib != item.n {            t.Errorf("Fibonacci was incorrect, got %d, expected %d", fib, item.n)        }    }}

Instalar Graphviz https://graphviz.gitlab.io/download/

create cpu file: $ go test -cpuprofile=cpu.out
execute file: $ go tool pprof cpu.out
/ top ----> comportamiento
/ list <function> ----> reporte
/ web ----> reporte descriptivo
/ pdf ----> reporte descriptivo pdf

Si alguien tiene problemas con instalar en macOS graphviz con brew(homebrew) y tiene el error:

svn: Couldn't perform atomic initialization 
SQLite error 
svn: SQLite compiled for x.x.x, but running with x.x.x

puede ser por que no tienen actualizado el SQLite, tambien puede ser que no este el link con el SQLite3 de brew y se use el de sistema se puede corregir con:

brew reinstall sqlite3
brew link --force sqlite3 

esto no es todo ya que si intentaste installarlo y te dio error quiere decir que varias dependecias ya se instalaron, entre esas la de subversion por lo que toca renistalarla, despues de tener el link con el SQLite3 de brew:

brew reinstall subversion

sudo apt install graphviz gv -y para ejecutar en ambiente linux

Esto esta genial