Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre la API del recolector de basura a la cual nos permite ejercitar algun control sobre el recolector de basura, desde C usamos a lua_gc:

int lua_gc(lua_State *L, int que, int datos);
Anuncios

Desde Lua usamos la funcion collectorgarbage:

collectorgarbage(que [, datos])
Anuncios

Ambas ofrecen la misma funcionalidad, el argumento que (un valor de enumeracion en C, un valor de cadena de Lua) especifica que hacer, las opciones son:

LUA_GCSTOP("stop"): detiene al recolector hasta otra llamada a collectorgarbage (o a lua_gc) con la opcion "restart", "collect" o "stop".
Anuncios
LUA_GCRESTART("restart"): reinicia el recolector.
LUA_GCCOLLECT("collect"): ejecuta un ciclo completo de recoleccion de basura, asi que todos los objetos inalcanzables son recolectados y finalizados, esta es la opcion predeterminada para collectorgarbage.
Anuncios
LUA_GCSTEP("step"): ejecuta alguna trabajo de recoleccion de basura, la cantidad de trabaja esta dada por la cantidad de datos en una manera no especificada (valores mas grandes equivale a mas trabajo)
LUA_GCCOUNT("count"): devuelve el numero de KB actualmente en uso por Lua, la cuenta incluye objetos muertos que no han sido recolectados todavia.
Anuncios
LUA_GCCOUNTB(): devuelve la fraccion del numero de KB de memoria actualmente en uso por Lua, en C el numero total de bytes puede ser computado por la siguiente expresion, asumiendo que el numero encaja en un entero:

lua_gc(L, LUA_GCCOUNT, 0) * 1024 + lua_gc(L, LUA_GCCOUNTB, 0);

En Lua el resultado de collectorgarbage("count") es un numero de punto flotante y el numero total de bytes puede ser computado como sigue:

collectorgarbage("count") * 1024

Asi que collectorgarbage no tiene equivalente para esta opcion.
LUA_GCSETPAUSE("setpause"): setea el parametro de pausa del recolector, el valor es dado por datos en puntos de porcentaje: cuando datos es 100 el parametro es seteado en 1 (100%).
LUA_GCSETSTEPMUL("setstepmul"): setea el parametro stepmul del recolector, el valor es informado tambien por datos en puntos de porcentaje.
Anuncios

Los dos parametros pause y stepmul permiten algun control sobre los controles del recolector, aunque ambos son experimentales asi que no tenemos una vista clara de como afectan la performance general de un programa.

Nota: El libro donde lo extraje era hasta la version 5.1 puede que en la version 5.3 ya este mejor implementado.
Anuncios

El parametro pause controla cuanto el recolector espera la finalizacion de una recoleccion y comienza una nueva, Lua usa un algoritmo adaptable para iniciar una coleccion: dado que Lua esta usando n KB cuando una recoleccion termina, espera hasta que se este usando n * pause KB para iniciar una nueva recoleccion, asi que una pausa del 100% comienza una nueva recoleccion tan pronto como la previa termina, una pausa del 200% espera que el uso de memoria se duplique antes de iniciar al recolector, este es el valor predeterminado.

Anuncios
Anuncios

Se puede setear un valor mas bajo de pausa si quieres intercambiar mas tiempo de CPU por menor cantidad de uso de memoria, habitualmente deberias mantener este valor entre 100% y 300%.

El parametro stepmul controla cuanto trabajo hace el recolector por cada KB de memoria asignada, a mas alto este valor menos se incrementa el recolector, un valor enorme como 1000000000% hace al colector trabajar como recolector no incremental, su valor predeterminado es 200%, valores por debajo de 100% hacen trabajar al recolector tan lento que quizas nunca termine una recoleccion.

Las otras opciones de lua_gc dan un control mas explicito sobre el recolector, los juegos son los clientes tipicos para este tipo de control, por ejemplo si no queres ningun trabajo de recoleccion de basura durante algun periodo puedes detenerlo con una llamada a:

collectorgarbage("stop") 

y luego reiniciarlo con:

collectorgarbage("restart")
Anuncios

En sistemas donde tienes periodicas fases inactivas puedes mantener al recolector detenido y llamar a:

collectorgarbage("step", n) 

Durante el tiempo inactivo para setear cuanto trabajo hay que hacer en cada periodo inactivo, puedes escoger experimentalmente un valor apropiado para n o llamadas a collectorgarbage en un bucle con n seteado a cero, significa pequeños pasos, hasta que el periodo expire.

Anuncios

En resumen, hoy hemos visto como es la API del recolector de basuras, como son las constantes para C, y cuales son los valores para Lua, como podemos implementarlas, algunas buenas practicas, y como podemos aprovechar tiempos inactivos de nuestro equipo, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00