lunes, 1 de septiembre de 2014

Procesar rápido, procesar despacio.

Optimizar la ejecución de un programa tomando como modelo el proceder de la mente humana.

Recientemente he sacado algo de tiempo para empezar a leer un libro de Daniel Kahneman al que quería echarle el guante. El libro en cuestión es Pensar rápido, pensar despacio y en él, este premio Nobel de economía nos presenta como nuestro cerebro actúa (y falla en múltiples ocasiones) en el proceso de toma de decisiones. Pese a que pueda parecer “un tocho” infumable, os lo recomiendo ya que es todo lo contrario, muy ameno y didáctico.
Sin repasar el contenido, si os avanzaré que Kahneman propone una división de nuestra mente en 2 sistemas a los que llama simplemente Sistema 1 y Sistema 2. El primer sistema actúa en modo automático y no requiere de ningún esfuerzo por nuestra parte para operar. El segundo en cambio, necesita que fijemos nuestra atención, que nos tomemos nuestro tiempo y que realicemos un esfuerzo en procesar la información. Como norma, en su búsqueda de la eficiencia, el cerebro opera con el Sistema 1 y solo reclama la atención del Sistema 2 (el que requiere de esfuerzo) cuando lo considera necesario. Un ejemplo de esto sería cuando conducimos en coche al trabajo. Normalmente este trayecto lo hacemos en “piloto automático” (gracias a nuestra experiencia al volante) guiados por el Sistema 1. No obstante, este Sistema 1, en caso de encontrar algún elemento excepcional como un accidente o retención inesperada, buscará el apoyo del Sistema 2 para procesar la información disponible y buscar la mejor ruta alternativa o cualquier otra acción que corresponda realizar.
En ausencia de detonantes, nos ahorramos el esfuerzo que el Sistema 2 nos demanda para procesar esta información y tomar una decisión en base a la misma.
Esta misma filosofía la podemos aplicar en muchas aplicaciones de autómatas con las que tengamos que lidiar . Aunque en este caso no tendremos 2 modos diferentes de proceso, sí que tendremos un tiempo de ciclo que podemos optimizar si solo atendemos procesos largos (muchos pasos de programa) cuando sea estrictamente necesario. Imaginad el siguiente escenario como ejemplo:
Hemos de registrar cada 5 segundos las siguientes variables que obtenemos al comunicarnos con un receptor GPS vía RS232 con el protocolo que corresponda: Latitud, Longitud, Altitud y resolución en metros.
En caso de querer hacer esto literalmente, programaríamos un “polling” continuado de las 5 variables para irlas registrando. No obstante, podemos hacer nuestro sistema más eficiente si solo consultamos la resolución en metros y en función de la respuesta decidimos si merece la pena recuperar el resto. Un valor de resolución 0 implicaría una falta de cobertura y convertiría en totalmente irrelevantes el resto de variables. En esas situaciones habríamos reducido la carga de las comunicaciones a un 25% y en mayor o menor medida los procesos que de ellas se deriven (tratamiento de la trama, formateo de los datos…). Habríamos optimizado nuestro tiempo medio de ciclo ejecutando exclusivamente las instrucciones necesarias cuando son necesarias. 
Seguro que si estáis atentos, en muchas aplicaciones podréis encontrar relaciones de dependencia de este tipo que podréis aprovechar para optimizar el tiempo de proceso de vuestros programas.
Además para aquellos que programéis autómatas de la serie FP0R de Panasonic es especialmente interesante tener esta filosofía en mente. Este PLC dispone de un área de memoria ubicada en los 3000 primeros pasos de programa que se ejecuta a una velocidad ultrarrápida (80ns por paso). Es ideal para la ejecución recurrente del corazón de nuestro proyecto (un imaginario Sistema 1 de los propuestos por Kahneman) ubicado en la POU principal, dejando el resto de tareas “eventuales” (las que asociaríamos al Sistema 2) en el área de velocidad convencional haciendo uso de POU’s que definiríamos como funciones. Ubicando y gestionando adecuadamente nuestras rutinas obtendremos un tiempo medio de scan mucho más reducido.
Consciente soy de no haber descubierto en este post un método revolucionario de programación, pero cualquier excusa es buena para destacar o recordar mecanismos sencillos que puedan mejorar el comportamiento global de nuestros programas o como en este caso, el tiempo de ejecución de los mismos.


Saludos y hasta la próxima.

No hay comentarios:

Publicar un comentario

cookieassistant.com