Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix kernel method missing slowing apps #3

Merged

Conversation

difernandez
Copy link

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 y Object#const_missing, que permitían definir variables del problema de programación lineal poniendo directamente algo como X_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:

module Kernel
  alias_method :old_method_missing, :method_missing
  def method_missing(value, *args)
    old_method_missing(value, *args)
  end
end

Entonces, para solucionar esto, se hace que las variables no se puedan definir simplemente como X_i, si no que se requiere que tengan Rulp:: al principio, es decir sería Rulp::X_i. Así, el method_missing y const_missing se pueden implementar en el module Rulp en vez de Kernel, 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 en LV, clase que representa una variable, con distintas subclases para los distintos tipos. Se llamaba por ahí con el to_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

Previously, a monkeypatch to Kernel#method_missing and Object#const_missing was used. The first one was causing significant app slowing in development, so this attempts to fix that
Copy link

@ankaph ankaph left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lo veo bien!

Copy link

@ldlsegovia ldlsegovia left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Qué bravo lo que se estaba mandando la gema. No habrá una alternativa? El cambio me parece bien. No tengo mucho que decir si el tiempo bajó 👍🏻

@difernandez
Copy link
Author

@difernandez
Copy link
Author

No habrá una alternativa?

mmm a la rápida vi y hay un par de cosas de Linear Programming, pero nada muy usado/mantenido. Además, es una de esas cosas que se usa hace mucho en el proyecto y no es tan simple de entender, al menos por ahora no veo que convenga cambiar a otra cosa

@difernandez difernandez merged commit 978c51d into fix-glpk-solver-file-parser Dec 11, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

3 participants