Crear software siempre parece ser una labor intrigante porque de hecho, si lo pensamos, las instrucciones que escribimos suponen que la computadora tendrá un comportamiento que esperamos. Cuando algo sale mal, entonces vemos nuestra lógica y notamos algún detalle que hace que ocurra un comportamiento inesperado, un resultado falso evidente, lo que nos hace "debugear", es decir depurar el código. Eventualmente obtendremos lo que queremos.
Pues bien, uno de los programas que estoy escribiendo para el doctorado, es el de tratar de "sacar una 'foto' a cada posición que se produce en una partida de ajedrez". Esta "foto" es una expresión Forsyth (o algo muy parecido), en donde se expresa en una cadena de letras la posición que estoy "fotografiando". Por ejemplo, la posición inicial sería:
tcadractpppppppp11111111111111111111111111111111PPPPPPPPTCADRACT
tcadract
pppppppp
11111111
11111111
11111111
11111111
PPPPPPPP
TCADRACT
Que representa la posición inicial del tablero, leída desde la esquina superior izquierda hasta la esquina inferior derecha.
Mi software permite entonces leer una partida de ajedrez, en formato PGN, y tomar una instantánea de la posición, salvándola en un archivo. Aparte de la posición se dan detalles como si es posible el enroque y quién juega. Pero eso para el misterio que tengo no ti3ne importancia.
El software ya lo describí en este enlace. Mi programa funciona pero es muy lento. Una partida puede quizás procesarla en 10 a 15 segundos, quizás más. Y etso hace que requiera mucha "galleta" computacional o que pula mi código para que trabaje mejor.
Una primera aproximación fue la de quitar todos los "application.processmessages" de mi código cuando éste se encuentra procesando una posición. En Delphi se tiene este comportamiento: si se entra en un loop, en un ciclo, Delphi rabiosamente hará el ciclo sin interrupciones, a menos que se use, dentro del loop, una instrucción application.processmessages, que hace que el sistema vea las interrupciones y les haga caso cuando está ejecutando el loop.
Por ejemplo, si estamos procesando una imagen para pasarla de color a tonos de gris, y no le ponemos dentro del loop un application.processmessages, el sistema cambiará todos los pixeles a tonos de gris y de pronto, en un pantallazo final, desplegará el resultado. Pero si ponemos esta instrucción dentro del loop, hallaremos que el sisteam despliega cada pixel que va pasando a tonos de gris. Así, si le quitaba todos los processmessages a mi código, no tendría que ver cada cosa que va pasando en el tablero para ir viendo qué posición está fotografiando.
Hice los cambios, compilé el software y lo corrí en la máquina con Windows 7. El resultado de procesar una minibase de partidas fue rapidísimo... El video en este enlace. En cambio, en una máquina con Windows 10, el resultado fue lamentablemente lento. este es el enlace al video.
Cabe decir que es el mismo programa compilado con las "optimizaciones" mencionadas corriendo en las dos versiones diferentes del sistema operativo de Microsoft. La máquina Windows 10 es de hecho más poderosa que la Windows 7. He aquí lo que dice cada uno de los sistemas:
Windows 10:
Windows 7:
¿Por qué uno es tan lento y el otro no? ¿Qué tiene Windows 10 que lo hace tan lento? ¿Por qué no funcionan las optimizaciones, que funcionaron en Windows 7, pero no en Windows 10? ¿Alguna idea?






















