Cuando nuestra máquina pierde su habitual desempeño, seguramente es tiempo de hacer mejoras del software, pues los equipos también envejecen, y pierden muchas de sus facultades. Y es que el software guarda una estrecha relación con la operatividad del hardware, siendo importante saber que se pueden contar con algunas herramientas cuando se está optimizando el software para retomar la rapidez del primer día. Para ello, sigue con nosotros, y conoce todo al respecto.
Indice De Contenidos
Optimizando de software
Para saber qué significa optimizando una aplicación, primero se deben manejar algunos conceptos sobre la optimización de un software, y para definir dicho término, se tiene que es el mecanismo a través del cual se modifican ciertos elementos de un software con la intención de lograr que el mismo opere de manera eficiente y con menores recursos, es decir, retomar su rendimiento.
En términos generales, dicha funcionalidad eficiente se puede retomar optimizando una aplicación de algunos de los programas con el propósito que trabaje más rápido, o pueda funcionar con menos memoria u otros recursos, o bien para que gasten menos energía.
General
Ahora, pasaremos a definir el término optimización, y para ello se debe desmenuzar su vocablo, cuya raíz óptimo, en sí mismo, ya deja saber su valor en el área de la informática, puesto que es lleva implícito la intencionalidad pretendida, porque obedece al proceso de optimización, que no es otra cosa, que conseguir que un equipo tenga un óptimo desempeño u operatividad. Donde un sistema optimizado habitualmente, será óptimo en una aplicación o para una audiencia.
La intención finalizar la repotenciación, es reducir el tiempo que un programa se lleva para llevar a cabo cierta función, logrando mayor capacidad. De allí que en una aplicación donde el espacio de la memoria supone un bien en extrema preciado, es factible usar un algoritmo más lento, a fin de usar menos memoria. Este tipo de proceso es frecuente cuando se está optimizando una aplicación Android, por ejemplo.
A pesar de que hasta ahora no esté disponible alguna solución de diseño que funcione adecuadamente para todos los casos, el trabajo de investigación y ensayo continúa intentándose por la ingeniería trades-offs, y lograr una optimización de atributos de mayor atractivo y eficiencia. Asimismo, el esfuerzo requerido para crear una pieza de software óptima, hasta ahora no ha sido capaz de ofrecer mejoras adicionales significativas.
Trade-Offs
Como bien se ha referido, cuando se está optimizando se centra las acciones en ofrecer una mejora ideal en los siguientes aspectos generales del rendimiento como fin último de dicho proceso; estos son el tiempo de ejecución, uso de la memoria, espacio del disco, ancho de banda, el consumo de energía, o algún otro recurso.
Y para lograr este cometido, se necesita un trade-off, en el cual ofrece algunos elementos para optimizar un equipo, no obstante, esto se logra a expensas de los otros componentes. Es decir, que para elevar el volumen de caché, por ejemplo, se mejora el rendimiento del tiempo de ejecución, pese a además, incrementa el consumo de la memoria. Y además, como parte de sus ventajas y desventajas más frecuentes, es que se incluyen la claridad del código y la precisión.
Existen casos donde el programador que está optimizando un equipo, opta por mejorar el software para ciertas operaciones, aunque con ello, se deprimen algunas operaciones menos eficientes. Dichas compensaciones obedecer a maniobras de carácter no técnico, como puede ser, cuando un competidor publica un resultado de referencia, y que debe ser mermado, a fin de optimizar el éxito comercial, donde tal maniobra consigue que el software sea menos eficiente.
Estos cambios, habitualmente se le refiere de forma jocosa como pessimizations. Puesto que, en muchos casos, un fragmento de algún código puede resultar tan optimizado, como para resultar ofuscado sin intención, pudiendo llevar a problemas en el mantenimiento del código o del proceso mientras se está optimizando.
Cuellos de botella
La intencionalidad de la optimización, además de mejorar la operatividad de los programas, puede obedecer a detectar eventuales cuellos de botellas, ubicando una zona crítica de código, como principal consumidor de los recursos, y que en términos informáticos se le conoce como hot-spot. Mientras que en área de la computación, el principio de Pareto se puede llevar a optimizar los recursos, donde se ha evidenciado que cerca del 80% de los recursos se usan mayoritariamente, por el 20% de las operaciones en promedio.
Ahora, en el campo de la ingeniería de software, generalmente este valor se aproxima al 90% del tiempo de ejecución de un programa, donde se consume en ejecutar el 10% del código, referido por el área como la ley 90/10. Se refiere además, que en muchos casos, adicionar mayor memoria, es posible que se contribuya a que un programa se ejecute más rápido. Como puede ser un programa de filtrado, que leerá cada línea, la filtrará y mostrará esa línea de insofacto.
Dicha operación cuando se está optimizando, se usa para obtener más memoria en una línea, a pesar de que el rendimiento sea bastante pobre. Y dicha optimización, es posible mejorarla leyendo un archivo, y luego colocar la información, pero en menoscabo de la memoria. Además, cachear los resultados es más efectivo, pero a su vez, demanda usar más memoria.
Niveles de optimización
El proceso cuando se está optimizando, no es sólo ampliar espacios, generar rapidez, entre otras prestaciones solicitadas o estimadas, sino que aunque parezca sencillo, supone tiempo, pericia y paciencia. Asimismo cuando se está optimizando, además del tiempo, se lleva a cabo en diversos niveles a saber:
Diseño: este corresponde al nivel superior del proceso, donde el diseño se puede optimizar a fin de aprovechar al máximo los recursos disponibles. De igual forma, implementar un proyecto beneficia una buena selección de algoritmos eficientes, así como la aplicación de los mismos, redundará en la escritura de código de buena calidad. Mientras que la arquitectura de un sistema generalmente, impacta su rendimiento.
El algoritmo elegido impacta también la eficiencia, en mayor medida que cualquier otro componente del diseño, y tiene lugar a partir de la elección del algoritmo, por ser lo primero que debe decidirse, donde los argumentos en contra de la optimización precoz, pueden ser difíciles de argumentar.
Código fuente: en este nivel, se puede prevenir aquella codificación de una calidad menor, pero que puede optimizar el rendimiento, evitando lentitudes observables. No obstante, luego de ello ciertas mejoras pueden mermar el mantenimiento. Otras mejoras actualmente, pueden ser llevadas a cabo por los compiladores optimizadores.
Nivel de armado: obedece al código y la fase de compilación, gerenciales y flags, que pueden usarse para ajustar las alternativas del rendimiento en el código fuente, así como en el compilador, como el uso del preprocesador para desactivar elementos innecesarios delsoftware, o la optimización de los modelos de procesadores específicos, o capacidades de hardware.
Compilación: este corresponde al compilador optimizador, a fin de asegurar que el programa ejecutable se optimice como el compilador lo permita.
Ensamblador: este obedece al nivel inferior, donde la escritura codificada usa una lenguaje ensamblador, creado para una plataforma de hardware específica, pudiendo producir el código más eficiente y compacta, si el programador aprovecha el total del repertorio de instrucciones de la máquina.
Ejecución: se refiere a compiladores just-in- time, así como a los programadores ensambladores, para llevar optimizar en el lapso po de ejecución, y excediendo la capacidad de los compiladores fijos, ajustando a su vez, dinámicamente los parámetros según la entrada actual u otros factores.
Optimizando en dependencia e independencia de la plataforma
Cuando se está optimizando el código, es posible tipificar en términos generales, en prácticas dependientes e independientes de la plataforma. Pese a en estos últimos, son eficientes en casi todas las plataformas, las técnicas dependientes de la plataforma, suelen usar propiedades particulares de la misma, o se fundamentan en parámetros según la plataforma única, o inclusive, en el procesador.
Cuando la optimización a nivel compilatorio con métodos autónomos de la plataforma, son genéricas, como el desarme de ciclos, reducción de llamadas a función, rutinas eficientes de memoria, reducción en las condiciones, entre otras, todo lo cual impacta la arquitectura del CPU de forma similar. Por lo general, estos sirven para obtener el tamaño total del instruction path length requerido para completar el programa o mermar el uso total de la memoria en todo el proceso.
En este mismo orden de ideas, se tiene que las técnicas dependientes de la plataforma, conllevan a planificar las instrucciones, donde el paralelismo en la instrucción, en datos, en las técnicas de optimización de memoria caché, es decir, aquellos parámetros que son distintos en las diversas plataformas, y los planes de instrucción óptima, pueden ser distintos, de hecho, en diversos procesadores de una misma arquitectura.
Diferentes algoritmos
Cuando se están optimizando las funciones relacionadas con el cálculo algorítmico, es posible denotar y lograr distintas formas eficiencia. Como puede ser, considerar el siguiente segmento de código en el disco C, donde la intención es obtener el total de todos los números enteros, desde el 1 al N, como sigue:
Int i, sum = 0; for (i = 1; i <= N; ++i) {sum += i;} printf(«sum: %d\n», sum); dicho código puede, en el caso que no haya un desborde aritmético, reescribirse usando una fórmula matemática como puede ser:
Int sum = N * (1 + N) / 2; printf(«sum: %d\n», sum); en este caso, la optimización, eventualmente se corresponde automáticamente a un compilador de optimización, seleccionando un algoritmo, computacionalmente más eficiente, garantizando la misma operatividad. No obstante, una mejora adecuada para el rendimiento, generalmente se obtiene a través de la erradicación de alguna funcionalidad distinta.
Vale acotar, que la optimización no siempre obedece a una obviedad. Como el ejemplo anterior, cuando se está optimizando realmente puede operar más lento que la versión original, si N resultara pequeño, y el hardware en particular, obtiene más rapidez en las operaciones algebraicas de adición y de bucles de multiplicación y división respectivamente.
Macros
Al respecto, si se está optimizando para desarrollar el código, cuando se usan macros, adopta formas distintas en diversos lenguajes. En algunos de estos lenguajes procedurales, como C, las macros se implantan a través de sustitución de palabras. Actualmente, las funciones inline se pueden usar como una opción segura en muchos casos. En los dos casos, es posible invertir mayor tiempo de compilación en el cuerpo de la función inline, para optimizar el compilado.
En otros tantos lenguajes computacionales funcionales, las macros se implantan sustituyendo el tiempo de parseado durante el parseo del árbol de sintaxis abstracta, que asegura su uso. Toda vez que en muchos casos, la interpretación se lleva a cabo de forma de garantizar que dichos cálculos sólo se hará en tiempo de análisis, y a veces la única forma.
Por su parte, Lisp desencadena este estilo de macros, referidos como Lisp-like macros. Donde el efecto parecido, puede lograrse a través del uso de las plantillas de metaprogramación en C++. En estos dos casos, la tarea se realiza durante la compilación; la diferencia entre las macros de C, por una parte, y macros Lisp y plantilla de metaprogramación de C++ por la otra, donde las últimas herramientas permiten hacer cálculos arbitrarios en tiempo de compilación/tiempo de parseo.
Optimización automática y manual
El proceso de optimización puede ocurrir de diversas formas, dentro de las cuales está la automatizada a través de compiladores, o por programadores. En estos casos, las retribuciones se limitan por lo general, a una optimización local, y en mayor grado, para las globales. Pese a que habitualmente, la optimización más potente es hallar un algoritmo de talla superior cuando se está optimizando.
Asimismo, la optimización puede atender al sistema en su conjunto, que se puede llevar a cabo por programadores, ello debido a su complejidad para el caso de optimizadores automatizados. Ante tal escenario, dichos especialistas o gestores del sistema sustituyen el código, de forma tal que el sistema en general, ofrezca un mejor rendimiento. Pese a que se puede obtener mayor eficacia, es más costoso que las optimizaciones automatizadas.
De la misma manera, es posible usar profilers para ubicar las secciones del programa que tiene más volumen de recursos, es decir, el cuello de botella. Eventualmente, se puede saber el lugar donde se ubica el cuello de botella, pero este instinto no siempre es la adecuada. Pues la optimización de una pieza insignificante de código, puede lograr muy poco para contribuir con el rendimiento general.
Una vez se ubique dicho cuello de botella, la optimización se inicia con un replanteamiento del algoritmo usado en el programa. Generalmente, un algoritmo particular se puede adaptar propiamente a algún problema específico, a fin de proveer un mayor rendimiento que un algoritmo genérico. Esto puede conllevar a clasificar una enorme lista de artículos que se lleva a cabo generalmente, con una rutina quicksort, que es uno de los algoritmos genéricos más eficientes.
Una vez el programador esté seguro sobre el mejor algoritmo, se selecciona y comienza la optimización del código. En esta fase, los bucles se pueden desenrollar para reducir la sobrecarga, pese a que a menudo, esto puede llevar a una menor velocidad si se sobrecarga la memoria caché del CPU, en este caso, utilizar datos más pequeño, para que la aritmética de enteros pueda usarse en vez de coma flotante.
Cuándo optimizar
Con la optimización se puede reducir la lectura, adicionando códigos que se usan para mejorar el rendimiento. Lo cual puede complicar los programas o sistemas, logrando con ello, que sean más difíciles de mantener y depurar. Como resultado, esta potenciación generalmente se hace al finalizar la etapa de desarrollo. Al respecto, Donald Knuth agregó las siguientes impresiones:
Hay que olvidarse de las eficiencias menores, como puede ser el 97% del tiempo, donde la optimización precoz supone la raíz de todos los males. Además atribuyo la cita a Tony Hoare, de hace algunos años, pese a que esto podría haber sido un error, puesto que Hoare dice no haber acuñado la frase, cuando afirmó: en la ingeniería establecida, una mejoría del 12% se puede lograr, y la misma no se valora como marginal, agregando que este misma apreciación debe prevalecer en la ingeniería de software.
Sobre la optimización precoz, supone un término acuñado para describir aquella situación donde un programador permite percepciones de rendimiento que afectan al diseño de una pieza de código. Lo cual puede dar como resultado un diseño no muy limpio, como pudo ser un código incorrecto, puesto que dicho código se complica por la optimización, y el programador puede equivocarse debido a esto.
Al resolver el momento para optimizar alguna zona particular de un programa, la ley de Amdahl debería considerarse en todo momento; pues el impacto sobre el programa en general, depende en buena parte, del tiempo que se lleve realmente en esa parte específica, que no siempre es clara, cuando se considera el código sin un análisis del rendimiento.
Una ideal adecuada para este fin, es diseñar en primer lugar, el código, y después observar aquellos componentes que serán objeto de mejoras. Un diseño sencillo y elegante, generalmente es más sencillo de optimizar en esta fase, y el profiling puede revelar problemas inesperados de rendimiento, que no han sido tratadas por la optimización prematura.
A los fines de ilustrar y entender mejor este proceso cuando se está optimizando, y lograr que el equipo responda como el primer día es pertinente llevar a cabo algunas tareas de optimización de forma regular. Donde los ideal es tratar con cuidado el ordenador cuando se trabaja en él, con lo cual en este tipo de tareas, se convertirán en rutina y, a largo plazo, puesto que sus efectos serán más que visibles. Y para ello se deben atender algunas sugerencias, según los niveles del proceso, tal como se describe a continuación:
Desinstalar aquello que no se use: para ello se cuenta con la red de redes, adecuado para todo los software del mundo, y con unos pocos clics. Aunque es un arma de doble filo, pues, si bien permite probar todas los métodos deseados, también es posible que, luego de una experiencia poco satisfactoria, se olviden en una recóndita carpeta del disco duro.
Optimizando el software: A fin de paliar esta condición, se puede ingresar al menú del panel de control/Programas/Programas y características. Y desde allí, se despliega una lista con las disponibilidades, fecha de instalación y el último uso; luego desinstalar adecuadamente aquellos elementos que no sean de utilidad.
Recomendada mensual: para ello, se sugiere desfragmentar el disco duro, el cual se lleva a cabo en el disco cuando los ficheros o programas almacenan la información en zonas no contiguas. Esto conlleva a la necesidad de contar con más tiempo, a fin de juntar todos los fragmentos del mismo, o bien para ubicar donde escribir nueva información. Pues, todo ello impacta negativamente en el rendimiento de la máquina.
Para optimizar este sector, se debe ir a Inicio/Accesorios/Herramientas del sistema/Desfragmentador del disco, y dar inicio al análisis de manualmente. Además, está la opción de programar una ejecución periódica.
Recomendación semanal: para ello se sugiere reparar los errores, lo cual ocurre si el equipo se apaga incorrectamente, en cuyo caso Windows lo detecta, siendo oportuno comprobar los errores antes de iniciar la máquina. No obstante, algunos programas pueden afectar a la integridad de los datos, por lo que se recomienda examinar este aspecto periódicamente, a fin de comprobar que la situación no se agrave, y el equipo deje de iniciarse adecuadamente.
Para llevar a cabo este procedimiento, se accede al explorador de archivos, seleccionar la unidad escaneadora y, en el menú contextual, elegir en Propiedades. En la pestaña emergente, se debe ingresar en Herramientas y pulsar en Comprobar ahora. Como no es posible ejecutar esta tarea sobre un disco en uso, lo conveniente es programarla para su próximo reinicio.
Eliminar temporales: desplazarse por la Web, representa observar miles de imágenes, fichas HTML, JavaScript, cookies,etc, pues los navegadores, en su esfuerzo por agilizar la carga de páginas, cachean buena parte de dicha información, de manera que, cuando se accede una segunda vez a una web, dichos ficheros ya está en el interior del equipo, eliminando la necesidad de descargarlos.
Desafortunadamente, si no se trata adecuadamente estos archivos, con seguridad que estos se almacenen en varios gigas, de los cuales, en un corto lapso de tiempo, general en efecto lateral nada deseable. Se sugiere por tanto, limpiarlos semanalmente por medio de Firefox, ingresando en Herramientas/Opciones y, en una etiqueta de Privacidad, ubicar y limpiar el historial reciente. Mientras que su ventana emergente, se ubica la opción de seleccionar individualmente el tipo de ficheros que se desea erradica.
Con el objeto de llevar a cabo la operación equivalente en Internet Explorer, hay que dirigirse al menú Herramientas/Opciones de Internet y, en el interior de la pestaña General, pinchar en Eliminar del área de Historial de Exploración, que además prevé la posibilidad de cribar los ficheros a limpiar.
Programas de optimización: aunque en los actuales tiempos, quizá no sean los más indicados para invertir en un nuevo hardware para un equipo; afortunadamente se disponen de otras opciones ideales para extraer el mayor provecho a sus prestaciones sin tener que erogar pequeñas fortunas. Pudiendo acceder en la web a muchos programas de optimización sin costo alguno, y que pueden lograr depurar y optimizar los sistemas operativos.
Tiempo que toma optimizar
Aunque se debe resaltar que el hecho de optimizar algún código existente, no significa per se agregar nuevas características al equipo, de hecho, puede ser peor, porque se pueden adicionar algunos bugs en código que anteriormente no los contenía. En vista de que la optimización manual, eventualmente hace del código menos claro que el no optimizado, y donde la misma, puede impactar en la compatibilidad como efecto adverso. Lo que indica que la optimización tiene un precio, y es importante asegurar que invertir en eso sea realmente beneficioso.
Asimismo vale acotar, que el propio potenciador automático, está sujeto a optimización, bien para potenciar la eficiencia de los programas producidos, o para motorizar su propio funcionamiento. Una compilación efectuada con la optimización activada, generalmente se lleva mayor tiempo, pese a que esto suele ser un problema sólo cuando los programas son muy grandes. A tales, fines es prudente traer a colación los siguientes aspectos:
Nuestro equipo envejece
Todo usuario de Windows, ha referido alguna vez ciertas quejas de su equipo y programas, sobre que llegó el momento de formatear el equipo. Tal amenaza, representa un reflejo de una realidad, que conlleva el continúo uso del equipo con el sistema operativo de Microsoft, y que lleva consigo la degradación progresiva del rendimiento, con la consecuente experiencia del usuario.
Tal condición no obstante, no responde a factores físicos o mecánicos, lo cual quiere decir, que no es que el procesador se torne más lento con el tiempo, ni que el propio disco duro requiera engrasarse, tampoco que la RAM sufra el conocido efecto memoria de las baterías, sino más bien, es que el problema obedece al software y en el contenido del disco duro, ni más ni menos, porque también envejecen, el tiempo no pasa en vano, ni siquiera para los equipos.
Programas para optimizar
Resulta habitual que debido a la irrupción de la internet y las vías de alta velocidad, trasladan un enorme volumen de programas y aplicaciones al equipo y disco duro, muchas de ellas sin permiso, donde, cada una de ellas posee un precio, aunque para nada económico, ni de espacio en disco, sino bajo el modelo de archivos residuales en el sistema.
Adicional a lo anterior, una vez se descargan estos ficheros de la Red, se obtienen en pequeñas porciones, lo que puede ser más agrave para el problema subyacente en la fragmentación del disco cuando se van a realizar tantas escrituras en el mismo. Asimismo, la acumulación de dichos ficheros, entradas de registro sin borrar, e inclusive, archivos dobles, logra que el rendimiento de Windows se reduzca cada día más.
En este caso, formatear es de mucha utilidad y una opción fácil de hacer, pero sin duda, se erradican de raíz todos los archivos, sean necesarios o no, pero dejan un sistema impoluto, cuyo proceso además obligará a reinstalar los programas indispensables, preservar los documentos o ficheros personales, y volver a aplicar las personalizaciones, opciones, complementos, etc, lo que requiere de tiempo para poder sentir que el equipo quedó nuevo, y a plena capacidad, rendimiento y optimizando nuevamente el equipo.
La principal contribución que suponen los métodos referidos a lo largo de este post, es que se pueden erradican aquellos elementos innecesarios e inútiles de forma automática, sin tener que acudir o instalar ningún otro elemento, y dejan el sistema en un estado cercano al que se obtiene reinstalándolo.
Si te pareció útil esta información, puedes revisar también: