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?
3 comments:
Hola buen día, que curioso que lo diga, a mí me ocurre algo similar, por así decirlo. Sabe, yo trabajo con equipos de análisis químico, y es cierto que a pesar de que estos vienen con un software que se supone es compatible con la versión más actual de Windows, corren mejor en uva versión anterior, de hecho Windows 7, los ingenieros de aplicaciónes tampoco se explican esto, solo saben que les ha funcionado para la comunicación del equipo de análisis con la computadora, que es de donde se controla. Y hablo de marcas como Thermo Scientific, Agilent y Waters. Tal vez Windows en su afán por mejorar su sistema, le faltó detallar los errores para compatibilidad. Ojalá alguien pueda explicarlo. Saludos.
Gio Fabián,
me han mandado por coreo una epxlicación plausible del problema. Probablemente la ponga en el blog en estos días.
saludos
Hola muy interesante el programa que estas realizando, en mi poca experiencia te puedo comentar que he notado que la velocidad de ejecución depende entre otras cosas de en donde compilaste tu aplicación, me paso algo bien chistoso hace tiempo cuando trabajaba con Delphi y es que en las computadoras del trabajo tenían windows 2000 y una aplicación que estaba desarrollando corría bastante bien, precisamente tenia que ver con procesamiento de imágenes, básicamente era capturar una entrada de vídeo y enviar esa imagen a otro nodo a través de internet, un día quise hacer una prueba desde mi casa en donde tenia windows XP y al correr el programa empece a notar que le costaba la captura de las imágenes y el procesado para enviarla, aunque como el proceso no era tan pesado al final funciono pero si note ese cambio como si procesara mas lento, después de eso hice na prueba pero esta vez compilando en mi computadora con windows XP y resulto que ahora si corría con mas "normalidad" en windows XP ya no notaba esa como lentitud en el procesamiento, ese efecto me llevo a estar jugando con la compilación de la aplicación en diferentes maquinas y al final lo que note es que mas que la computadora es el SO donde se compila y mas si usas las apis de windows, al parecer al compilar con esas apis están optimizadas para correr en ese SO que lo compilaste y si lo corres en un windows mas viejo no tiene tantos problemas pero si lo corres en uno mas reciente hace efectos extraños con algunos procesos.
Espero mi experiencia te ayude a resolver ese misterio, cabe aclarar que esto me ocurrió por ahí del año 2005 y actualmente ya no programo en delphi, es mas ya tiene mas de un año que no compilo para PC actualmente me dedico mas a aplicaciones android o ios así que no se si ese efecto aun sea del todo valido la ultima vez que use un lenguaje para PC fue visual studio 2008 con C# en el año 2010 y en ese tiempo ya no hice tantas pruebas pero si note que con algunas compilaciones de windows vista (ya no con todas) la aplicación se comportaba lentísimo y con las de windows 7 corría bien y en ese tiempo yo lo compilaba en windows 7.
Post a Comment