martes, 17 de marzo de 2015

Paralelismo en la generación del autómata

En la anterior entrada comenté que sería interesante que al insertarse las expresiones regulares en el autómata lo hiciese usando hilos para intentar mejorar la velocidad de carga.

Lo he llevado a cabo pero no he obtenido los resultados que esperaba.

Antes iba cargando todas las expresiones regulares de forma secuencial. Los problemas que surgen de esta implementación son principalmente dos:

  1. Sólo trabaja con una ER cada vez.
  2. La dependencia de unas ER a otras hace que el orden de la secuencia de carga de las ERs no pueda alterarse. Por ejemplo, no se puede definir un Natural si antes no se ha definido un Dígito.
Tras varias implementaciones y búsqueda de mucha información de como trabajar con hilos, conseguí programar una versión de la aplicación que lanzaba un hilo por cada ER al cargar en el autómata y tantos hilos como signos '+' de la ER tuviera más uno, es decir, un hilo por cada subexpresión regular. Cuando una ER encuentra una dependencia que aún no ha sido cargada, bloquea el hilo hasta que se resuelva por sí solo.

El problema de la dependencia queda definitivamente erradicado. Ahora no importa el orden al insertar las ERs.

Sin embargo no se ha ganado tiempo en la carga de todas las ERs, incluso tarda un poco más. Parece ser que apenas trabaja en paralelo y se pasan la mayoría del tiempo bloqueados los hilos esperando que se resuelvan las dependencias y lo que se pueda ganar en determinadas ocasiones que pueda trabajar paralelamente, lo pierde en las comprobaciones de disponibilidad.

A pesar de todo lo considero un gran avance ya que ahora podemos despreocuparnos de las dependencias entre unas ERs y otras.

Puede ser que las secciones críticas de los hilos no estén bien programadas, no soy un experto en el tema. Así que si alguien se anima para revisarlo, es bien recibido.

No hay comentarios:

Publicar un comentario