Logotipo del programa Firefox Hace un par de días me enteré en Genbeta, y, hace un rato en la bitácora de Andrés Nieto, de la existencia de Firefox Ultimate Optimizer, que, según pude leer, conseguía "optimizar" el consumo de memoria RAM de Firefox "de verdad". Así que descargué el programa en cuestión, y, como, aparentemente, el consumo de memoria RAM por parte de Firefox disminuía, me picó la curiosidad y quise saber dónde estaba "el secreto".

Ignoraba que el propio autor del programa reconocía no hacer magia, sino que usaba la función "EmptyWorkingSet()" del API de Windows. No lo sabía, digo, y tuve que "decompilar" el programa para averiguar, que, efectivamente, se limita a ejecutar dicha función sobre el proceso de Firefox, y sobre el proceso del propio programa, cada pocos segundos, utilizando un "Timer". Y eso es todo lo que el programa hace. Ni más, ni menos.

Ahora bien, ¿qué tiene de mágica la mencionada función? Dicha función termina llamando a otra, si no me equivoco, que es "SetProcessWorkingSetSize()", y, esta función es la que usa el propio Windows, por ejemplo, cada vez que una aplicación se minimiza a la barra de tareas. Vale, ¿pero qué hace esta función? Pues, "sencillamente", guarda el "espacio de trabajo" de un proceso (el de Firefox, en este caso) desde la "memoria física", a la "memoria virtual". Es decir, guarda las "páginas" de la memoria que esté usando Firefox en el disco duro, dejando así libre dicho espacio en la "memoria física".

Aquí hay que puntualizar varias cosas. Primero, que me he hartado de buscar información sobre "SetProcessWorkingSetSize()", más allá de la que se obtiene en la documentación del API de Windows, y, aunque he encontrado resultados interesantes (véase más abajo, en los enlaces que propongo sobre este asunto), lo cierto es que no me han quedado claras y aún no me quedan claras bastantes cosas, debido a mi ignorancia, por supuesto. Pero, el caso es que dicha función no sirve para "optimizar" la memoria de ningún procreso. Esto es algo que parece quedarme bastante claro. Veamos porqué.

En primer lugar hay que decir que el desempeño de una aplicación no puede medirse sólo por la memoria RAM que consume. Que una aplicación funcione o no bien, que sea más o menos lenta, no depende en exclusiva de la memoria RAM que consuma. Dicho esto, por lo que he leído, está bastante extendida entre los usuarios la percepción de que si un programa consume menos memoria RAM, este irá mejor. Pero, no deja de ser eso, una percepción equivocada, porque se están obviando el resto de variables y factores posibles.

Hemos dicho que el propio Windows hace uso de la función "SetProcessWorkingSetSize()" cuando una aplicación se minimiza. Pero, resulta que esto es así porque Windows "supone" que una aplicación que acaba de minimizarse, no será utilizada, al menos, en cierto tiempo. De modo que aprovecha para guardar las "páginas de memoria" ocupadas por la aplicación en la "memoria virtual" (haciendo uso del disco duro), dejando la "memoria física" (mucho más rápida) disponible para otros programas.

Como no quiero alargarme mucho más, porque hay muchas cosas que se me escapan por completo en este asunto, diré lo que me queda claro de ello. Y es que no debería ejecutarse la función "SetProcessWorkingSetSize()" alegremente, mucho menos dentro de un "Timer", cada pocos segundos, porque, aunque "veamos" que el consumo de memoria RAM de un programa se reduce, lo cierto es que la operación conlleva otros costes que pueden resultar incluso más graves. Por ejemplo, el programa podría tender a tener ciertos problemas, precisamente, con la memoria RAM. Le hace más vulnerable en este sentido.

Prácticamente todos los artículos que he leído al respecto desaconsejan el uso de estas técnicas para optimizar el uso de la memoria RAM por parte de un programa. Prácticamente todos coinciden en que el manejo de la "memoria virtual" ha de dejarse al propio sistema operativo. Yo estoy de acuerdo con esto. En primer lugar, porque, como he dicho, la cantidad de memoria RAM ocupada no es lo único que puede hacer que un programa "vaya mal". Y además no es la forma de atacar el problema, si es que notamos que nuestro programa no se comporta como se espera.

Por ejemplo, programando en Delphi, uno hace uso de recursos, instancia objetos, que deben ser liberados una vez dejen de utilizarse. Y esto es, precisamente, lo que hay que hacer, y, a nadie se le ocurre llamar a la función "SetProcessWorkingSetSize()" para que se ocupe de nada. De hecho, buscando en el código fuente de la VCL ("Visual Component Library"), se ve que no se hace uso de esta función en absoluto, en ningún lugar, ningún componente de la VCL hace uso de esta función.

Cuando a uno le va mal un programa, y nota que acaso consume demasiada memoria RAM, tal vez lo primero que le viene a la cabeza es "cómo puedo liberar la memoria RAM", pero, es el planteamiento equivocado. Habría que ver qué hace que tu programa consuma más memoria de la cuenta, por qué se comporta como se comporta, si estás programando "con buenas prácticas". En todo caso, la solución a tu problema no será "liberar memoria RAM" al precio que sea. Si te planteas esto, es que no sabes realmente qué te traes entre manos en tu programa. Es decir, que lo único que quieres es "esconder" el problema.

En definitiva, ¿es aconsejable el uso de Firefox Ultimate Optimizer? La respuesta corta es que no, ni ningún programa de similares características. Este además está desarrollado en C# para .NET, por lo que, de entrada, es preciso que el .NET Framework esté disponible, y, más aún, "ejecutándose", de modo que el propio programa Firefox Ultimate Optimizer consumirá unos recursos nada desdeñables. Pero, aunque el programa estuviera escrito en ensamblador, tampoco aconsejaría su uso, sencillamente, porque no consigue su objetivo, ni puede conseguirlo de esa manera, antes al contrario.

En primer lugar, es posible que no pueda conseguirse dicho objetivo, esto es, optimizar el uso que Firefox hace de la memoria RAM. Esto no es tan sencillo como ejecutar una función ni nada parecido. Yo no sé a qué se debe que Firefox consuma tanta memoria, aunque, pueda tener algunas ideas al respecto, pero, ningún programa, hasta donde yo llego, podrá hacer que funcione mejor, o, cuando menos, Firefox Ultimate Optimizer no lo conseguirá, dado que la técnica que utiliza no es la apropiada. Antes al contrario, como digo, el programa puede hacer que nuestro sistema consume más recursos aún.

En segundo lugar, la propia ayuda de la función "SetProcessWorkingSetSize()" recomienda usarla sólo para "pruebas" ("testing and tuning", literalmente), de hecho recomienda utilizarla "con mucho cuidado" ("carefully"), puesto que lo que hagamos en nuestra aplicación puede afectar al resto de aplicaciones y al propio sistema operativo. El propio Windows usa dicha función cuando una aplicación se minimiza, suponiendo que esta aplicación no va a ser utiliza durante un tiempo, se asegura de guardar su "espacio de trabajo" fuera de la memoria RAM física. Ahora bien, este no es el caso de Firefox Ultimate Optimizer, que, ejecuta esa función dos veces (sobre Firefox y sobre su propio proceso) cada pocos segundos.

¿Entonces Firefox Ultimate Optimizer romperá tu ordenador? No, no es eso. Pero, en mi opinión, a unos les funcionará peor que a otros. Descartando que consigua lo que se supone que quiere conseguir, notarás que Firefox Ultimate Optimizer afecta más o menos a tu sistema, dependiendo de varias cosas. Por ejemplo, si tu disco duro no es muy rápido, notarás que el sistema irá peor, porque, precisamente, lo que el programa está haciendo es "forzar" el uso del disco duro en lugar de la memoria RAM. Si tu disco duro es rápido, notarás menos esta circunstancia, obviamente.

Todo este jaleo de programas "opimizadores" de la memoria RAM, viene dado por el hecho de que la gente cree (creemos, diré) que un programa que consume menos RAM funciona mejor que otro que consuma más, y sólo por esto. Pero, esto no es así en todos los casos. Y, desde luego, "forzar" que un programa consuma menos RAM, es decir, forzar que use el disco duro, la "memoria virtual", en lugar de la "memoria física", es del todo contraproducente, puesto que cuando el programa "necesite" la RAM, la obtendrá del sistema operativo, de modo que estaremos forzando el doble trabajo de guardar una algo para tener que recuperarlo acto seguido.

Voy a dejar aquí una serie de enlaces a artículos que me he encontrado en mi "investigación", desde luego interesantes si te pica la curiosidad sobre este asunto. Y, respecto de usar Firefox Ultimate Optimizer o no, tú mismo, oyes, pero, que sepas que realmente no hace sino lo que otros tantos "optimizadores de memoria" que existen para Windows, y que, en algunas ocasiones, el remedio puede terminar siendo peor que la enfermedad. A partir de ahí haz lo que quieras. Y ahora vengan los enlaces prometidos: