Evitar la basura es relativamente sencillo. Debe comprender dónde se realizan las asignaciones y ver si puede evitar la asignación.
Primero, declarar variables al principio de una función NO ayudará. El compilador no sabe la diferencia. Sin embargo, los humanos sabrán la diferencia y los molestará.
El uso de una matriz en lugar de una división funcionará, pero eso se debe a que las matrices (a menos que se eliminen las referencias) se colocan en la pila. Las matrices tienen otros problemas, como el hecho de que se pasan por valor (copiado) entre funciones. Cualquier cosa en la pila es "no basura", ya que se liberará cuando la función regrese. Cualquier puntero o segmento que pueda escapar de la función se coloca en el montón que el recolector de basura debe tratar en algún momento.
Lo mejor que puede hacer es evitar la asignación. Cuando haya terminado con grandes cantidades de datos que no necesita, vuelva a utilizarlos. Este es el método utilizado en el profiling tutorial en el blog Go. Sugiero leerlo.
Otro ejemplo además del que está en el tutorial de creación de perfiles: digamos que tiene una porción del tipo []int
llamada xs
. Continuamente agrega al []int
hasta llegar a una condición y luego la reinicia para que pueda comenzar de nuevo. Si lo hace xs = nil
, ahora está declarando que la matriz subyacente del sector como basura se debe recopilar. Append reasignará xs la próxima vez que lo use. Si en su lugar lo hace xs = xs[:0]
, aún está restableciéndolo pero manteniendo la matriz anterior.
En su mayor parte, tratar de evitar la creación de basura es una optimización prematura. Para la mayor parte de tu código, no importa. Pero puede encontrar de vez en cuando una función que se llama muchas veces que asigna mucho cada vez que se ejecuta. O un bucle donde reasignas en lugar de reutilizar. Esperaría hasta que veas el cuello de la botella antes de ir por la borda.
Supongo que primero debe hacer un perfil antes de realizar una optimización como esta. Consulte [este] (http://blog.golang.org/2011/06/profiling-go-programs.html) entrada de blog sobre la creación de perfiles. También optimizan la recolección de basura. ¿Debería ser un buen comienzo? – Christian
¿Por qué está cerrado? Pregunta: ¿Cómo evitar la recolección de basura? Evite la asignación de heap (con ejemplos referenciados específicos). La pregunta es relevante y específica, y la respuesta no parece discutible. – user634175