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:
Publicada el Viernes 14 Marzo 2008 4:58 por David Esperalta
Suscribirse a esta entrada - URL para Trackbacks
Es que como programador, y conocedor del tema, me di cuenta que no podÃa ser... Uno siempre termina sacrificando memoria por velocidad de proceso o viceversa.
Gracias por tu comentario Nacho. Hombre, yo no digo que no pudiera "optimizarse" un programa, por parte de otro programa... cosas más difÃciles se habrán visto, ¿no te parece?
Sin embargo, la "técnica" utilizada en este caso, y parece que en otros muchos "optimizadores", no sólo no es la adecuada, sino que tiende a ser más bien contraproducente.
Pero, consiguen hacer ver (y por tanto creer) que el programa en cuestión reduce su consumo de memoria RAM, lo que es suficiente para que existan este tipo de "optimizadores".
Esto es parecido a aquellas pulseras con "piedras magnéticas" que se vendÃan hace años (y que aún se venden, digo yo, de una forma u otra) y que hacÃan creer a quien las portaba que les libraba de no sé cuántas enfermedades.
Si consiguen hacértelo creer... igual hasta te resulta cierto, ya sabes aquello del "efecto placebo", pero, desafortunadamente, el asunto no es tan sencillo, ni en este ni en ningún otro caso, me temo.
Hola David, me ha gustado mucho este artÃculo, yo escribà otro acerca del FUO este pero no me metà mucho en detalle ya que los lectores de mi blog no suelen ser programadores de aplicaciones. Quise hacer una explicación más simplista para que lo entendiese un poco la gente: en este enlace
Si te digo la verdad barajé la posibilidad de ocultar parte de la memoria bajo otros procesos porque una carga en memoria principal de 300kb que me llegaba a dar me cuesta bastante creerlo. El firefox en sÃ, liberando mediante el "SetProcessWorkingSetSize()" la mayor cantidad posible de memoria principal, se me hace raro que pueda ocupar solo 200 o 300kb. Pero me parece tan enrevesada esta teoria que al final pienso que no.
Eso sÃ, esta "forma de optimizar" (el FUO) tiene que funcionar también con el Explorer (EUO), el Opera (OUO)... ;)
Gracias por tu comentario Alfonso. En realidad no son 300 KB de memoria en lo que se "queda" Firefox. Podemos decir que en la memoria RAM "fÃsica" quedan esos 300 KB, pero, en la "virtual" (que se guarda en el disco duro, creo que podrÃa decirse, mal y pronto) estará el resto de la memoria ocupada por Firefox.
Por otro lado, efectivamente, esta "técnica" funciona con otros programas. En alguno de los enlaces que he propuesto al final de esta entrada se muestra cómo "fabricar un optimizador de memoria", que, como se espera: recorre todos los programas en marcha y utiliza la función que ya sabemos en todos ellos.
Algunos "optimizadores" van un poco más lejos: piden a Windows una cantidad grande de memoria (aprovechando la misma función, por cierto), de modo que no dejan nada para el resto de programas, a los que Windows se ve obligado a "darles memoria" en todo caso, pero, ya no "fÃsica", ocupada toda por el "optimizador".
TodavÃa no comprendo bien este asunto, pero, en todo caso, lo que parece quedarme claro es que estos "optimizadores" en realidad no optimizan nada. Recomiendo encarecidamente leer el artÃculo enlazado más arriba: The Truth about Windows Memory Optimizers, que, aunque en inglés, para mà tengo que se explica mejor de lo que yo lo he hecho.
En en este último artÃculo, si no recuerdo mal, donde se trata de una posibilidad de que estos "optimizadores" puedan aportar algo. Se trata de que, automáticamente después de "liberar la memoria", un programa podrÃa llegar a ejecutarse más rápidamente, puesto que tiene a su disposición más (o toda la necesaria) memoria RAM fÃsica. Pero, esta es una posibilidad "remota", por decirlo asÃ.
Además, está el hecho de que en el caso de que hablamos el "opitimizador" ejecuta la función para "liberar memoria" cada pocos segundos, y cuando se supone que Firefox está en pleno "proceso", vamos, que no está minimizado (entonces el propio Windows ejecuta dicha función, ya hablé de esto más arriba, en la entrada). Súmale a esto el hecho de que el programa necesita que el .NET FrameWork esté funcionando y, bueno, echa cuentas.
Podrás "ver" y podrás "creer" que el programa ocupa menos memoria RAM, y asà es, en cierto modo, pero, se trata de una ilusión (no lo digo yo, lo dice el autor del artÃculo que he enlazado antes) y además es una ilusión que tiene su coste por otro lado, que, probablemente, no compensa el uso del "optimizador" en cuestión. Pero, no quiero alargarme más, que, ya me parece que soy un poco pesado y todo.
Pero gracias otra vez Alfonso, por tu comentario. Ahora leeré el artÃculo que has enlazado tú.
Muy buen articulo y muy bien explicado.
En mi caso particular (tengo 2gb de ram) no me afecta que firefox consuma 296mb (con 8 pestañas), pero si me afectaria que esos 296 megas esten almacenados en el disco, ya que todo seria incluso mas lento (en linux, firefox es muuy lento) Saludos
Gracias palermi. ;)
Es una soberana estupidez pasar las paginas de un programa a la memoria virtual a pura fuerza. Para los que no tienen estudios de computación sepan que la velocidad en ir a buscar datos a las memorias ( fÃsica (memoria ram), o virtual (disco duro)) se llama latencia, y la latencia de la memoria ram es mucho mas pequeña que la del disco duro, por tanto es una memoria muchÃsimo mas rápida (por eso es una memoria mas costosa) y el disco mucho mas lento.
Excelente articulo David.
Salu2.
Gracias a ti tocayo, por tu comentario. ;)
Este FUO no me parece bueno ya lo probe, y si bien es cierto que baja la cantidad de memoria fisica que consume el Firefox, tambien es cierto lo que dice David, lo he comprobado yo mismo, y aparte me he fijado que el uso del procesador se eleva considerablemente cada cierto tiempo, cosa que no es muy buena ya que esto es lo que hace que una maquina se guinde o se torne lenta, en realidad nunca he creido que un Software que consuma menos memoria es mucho mejor, mas bien creo que un software que consuma menos recursos del CPU es mucho mejor, yo no usaria este FUO solo por esta sencilla razon.
mientras hacia el analisis pude apreciar que cuando pasaba de pestaña en pestaña en el firefox el CPU se iba a picos demasiado altos por milesimas de segundo, tal vez en un Procesador de doble nucleo no suceda esto, o puede que sip pero imaginense una maquina con un procesador de vieja tecnologia, y tambien de poca memoria.
En conclusion pienso que no es recomendable usarlo, razon: "Consumo Indevido e Inescrupuloso de la CPU".
Totalmente de acuerdo con tu explicación, David. Incluso preferirÃa, en cierto modo, que ocupara más en la RAM que en la Virtual.
La verdad que yo quedé impresionado (la primera vez) de bajon en la RAM, pero yo siempre me he guiado de la gráfica de la Memoria Virtual en el tab de rendimiento del "Task Manager". Y ese no bajaba. Hay comenzó un poco la sospecha.
Hasta pronto, David.
Pues asà es la verdad Van Troi. Un saludo para ti también. ;)
A punto de publicarlo en mi bitácora, empece a notar comportamientos extraños en mi ordenador, y recordé que desde que instale el FUO, empezaron lo quite y todo OK
Pues ahà queda dicho d@rWiN. Por cierto, gracias por el enlace a tu bitácora, ya estoy ahà leyendo cosas interesantes. ;)
Gracias Amigo!, pero ahora por el trabajo la tengo algo olvidada :(
Muy bien explicado el artÃculo, me queda claro que no es una extensión recomendable. En mi opinión, el consumo de memoria de una aplicación no puede medirse en memoria ram, sino memoria virtual, y la gestión de dicha memoria deberÃa dejarse al sistema operativo, que para eso está.
[taliban_linuxero=on] Aunque en el caso de Windows, esta última afirmación es dudosa. Menos mal que hace tiempo que no lo uso para nada :D [taliban_linuxero=off]
Gracias por tu comentario deigote. ;)