Fix kernel method missing slowing apps #3
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
NO ELIMINAR RAMA, ESTE FORK NO ESTÁ PUBLICADO COMO GEMA Y SE USA DIRECTO DESDE LA GITHUB EN UNA RAMA
Contexto
Rulp es una gema para modelar y resolver problemas de optimización/programación lineal. Permite definir variables enteras, binarias y sin restricciones. Se usa en uno de los proyectos de platanus y se usa fork desde una rama debido al problema descrito en #2.
En el proyecto que se usa, desde que se usa esta gema hubo un problema que hacía que en ambiente de desarrollo recargar una vista fuera muy lento.
Qué se está haciendo
Se determinó que las causas del problema anterior eran los monkeypatch a
Kernel#method_missing
yObject#const_missing
, que permitían definir variables del problema de programación lineal poniendo directamente algo comoX_i
en el código. El primero sobre todo generaba mucha lentitud, ese método se llama muchas veces al cargar una vista o hacer cualquier cosa en Rails. Probando, se descubrió que el problema no era qué se hacía en el monkeypatch, ya que algo tan simple como lo siguiente también provocaba la misma ralentización:Entonces, para solucionar esto, se hace que las variables no se puedan definir simplemente como
X_i
, si no que se requiere que tenganRulp::
al principio, es decir seríaRulp::X_i
. Así, elmethod_missing
yconst_missing
se pueden implementar en elmodule Rulp
en vez deKernel
, evitando que se llame en casi cada cosa que se hace en Rails.Para que funcionara bien, se tuvo que también definir un
method_missing
enLV
, clase que representa una variable, con distintas subclases para los distintos tipos. Se llamaba por ahí con elto_proc
, no entendí demasiado bien por qué, no quise reestructurar nada ni indagar demasiado.El cambio logro sacar la lentitud, pasando de uno o dos minutos a algunos pocos segundos