Ceibal-Chess: mejora significativa de desempeño

Realizando algunas pruebas básicas de profiling de Ceibal-Chess, noté que por algún extraño motivo el subproceso creado para ejecutar el motor de ajedrez (gnuchess) consumía una cantidad impresionante de CPU.

Inmediatamente esto me llamó la atención, debido a que el proceso estaba siendo configurado en modo “easy”, que deshabilita que se planifiquen jugadas durante el turno del usuario. Para peor, invocando gnuchess manualmente desde la terminal no provocaba este efecto.

Definitivamente se trataba de un tema a investigar en detalle.

Tras probar distintas invocaciones y parámetros, pude determinar que el problema resultó ser en la forma en que se creaba el subproceso.

Nuestra invocación era realizada aproximadamente de la siguiente forma:

from subprocess import Popen, PIPE
...
#Mal!!:
proc = Popen(args=["-e", "-x"], executable="/ruta/absoluta/a/gnuchess-linux", stdin=PIPE, stdout=PIPE, close_fds=True)

Resulta ser una sutileza, pero no se está brindando la ruta al ejecutable como primer argumento y si bien la llamada funciona de todos modos y el proceso es creado, tras comenzar a escribirle en su entrada estándar (stdin), éste comienza a utilizar el 100% del procesador.

Cambiar la llamada a Popen de forma tal que incluya el ejecutable como primer elemento de la lista args misteriosamente resuelve este problema.

Al probar el cambio sobre la XO, no solo se nota que el desempeño de la aplicación es mucho mejor (la interfaz de usuario tiene ahora más tiempo de CPU disponible), sino que además se solucionó un problema con un molesto icono que quedaba trancado en la vista home de Sugar.

Los cambios ya se encuentran commitieados al repositorio y próximamente estaremos actualizando las versiones disponibles en Algorithmia y el sitio oficial del CeibalJam.

This entry was posted in ceibal-chess, Programacion, Python. Bookmark the permalink.