Inflación de software en términos de recursos de procesador: ¿por qué las versiones más nuevas de la aplicación a veces son mucho más lentas que las anteriores?

Preludio


Era un jueves por la noche normal. Regresé del trabajo, me senté en la computadora portátil, la encendí, comencé Skype y comencé a esperar habitualmente a que se iniciara por completo. Y de repente pensé: ¿por qué tardó tanto en cargarse, e incluso el sistema es claramente difícil de soportar este proceso?

Decidí buscar en el Administrador de tareas para estimar cuántos recursos consume Skype en segundo plano. Pero primero, unos pequeños cálculos preliminares. ¿Y cuánto debería consumir esto los recursos? Estoy hablando del fondo ahora. Aquellos. cuando no hay conexión de video, ni siquiera hablo al micrófono con nadie. Todo lo que se trata es una lista de contactos, que se muestra en forma de iconos y nombres, y un menú en el que puede elegir algo.

Aquellos. esta es una forma, de hecho, desde la cual puede iniciar menús adicionales. Hay una lista en este formulario. Y un cuadro de texto para ingresar mensajes a alguien, algunos botones. Hace unos 15 años, cuando escribí en Delphi, una aplicación de este tipo (con un formulario) pesaría un par de cientos de kilobytes. Por supuesto, desde entonces el entorno de desarrollo comenzó a consumir muchos más recursos, los componentes visuales se han enriquecido. Sin embargo, incluso con este progreso, Skype en segundo plano debería pesar alrededor de 10 megabytes como máximo. Después de todo, no estoy hablando ni llamando a nadie, ¿qué más puedo gastar tanto allí?

Puedes ver este asunto y, por otro lado, como dicen los matemáticos, equivalencia. Sin videollamadas ni conversaciones con el micrófono, Skype brinda la oportunidad de ver cuál de los interlocutores está actualmente en la red, así como enviarle un mensaje de texto y recibir un mensaje de texto en respuesta de alguien. Aquellos. esto es esencialmente ICQ, entonces, bueno, probablemente en segundo plano, muy probablemente, ¿debería Skype ocupar tanto como ICQ en la memoria? Ahora revisemos en la práctica estos cálculos. Observamos el consumo de memoria en el TaskManager:

imagen

¿Skype ocupa 158 MB de memoria? ¿Hablas en serio considerando que QIP es de 35 MB? De acuerdo, 35 MB probablemente sea demasiado, y esto debería resolverse, pero mi nota no se trata de eso. Ahora estamos sobre Skype. ¿Por qué ocupa tantos recursos, casi 5 veces más que QIP? Es demasiado para un formulario con una lista de contactos, ¿no?

Curiosamente, este problema no me concierne solo si conduces a Google " ¿Por qué Skype consume tanta memoria? ", Entonces se caerá en el pie de varias discusiones en los foros por qué las nuevas versiones de Skype pesan tanto. Las respuestas son especialmente agradables. Por ejemplo, una respuesta real en el foro de la comunidad de Skype (cito mi traducción gratuita de la respuesta):

, ? 4-8 . 140 , .


Si sí. Por supuesto. Si es así, todos los desarrolladores de software razonarán, de esa manera " no hay suficientes volúmenes ". La pregunta no es que lo siento por la memoria de Skype (y lo siento también). La pregunta es, ¿qué hay de nuevo en la funcionalidad agregada en las nuevas versiones de Skype (en comparación con las antiguas), que requieren tanta memoria?

Pero está bien. Estaba más interesado en otra pregunta: el procesador con Skype en segundo plano tampoco se relajó realmente y periódicamente mostró incluso una carga completa. Surge la pregunta: "¿Por qué y cómo deshacerse de esto?". De hecho, la pregunta debería sonar así: ¿cómo logran los desarrolladores crear aplicaciones tan voluminosas? ¿Y qué hacer con eso?

Un poco de historia


Por supuesto, cualquier visitante de este sitio probablemente al menos una vez escuchó sobre la ley de Moore para mejorar el rendimiento del sistema. El artículo Se acabó el almuerzo gratuito proporciona una imagen tan curiosa:

imagen

Como puede ver, en algún lugar de 2004, los procesadores alcanzaron el límite en términos de frecuencia de reloj. Y los últimos 10 años, esta frecuencia no está creciendo particularmente. ¿Se deduce de esto que la ley de Moore ha dejado de cumplirse? En realidad, no, y el artículo explica clara y claramente por qué. Simplemente, el rendimiento de nuestras computadoras ahora está creciendo debido a otros factores (caché y multinúcleo). El problema, sin embargo, es que las aplicaciones normales de un solo subproceso no podrán acelerar estos factores. Y aquí esta el problema. El hecho es que muchos fabricantes de software de hoy en día se comportan como si el patio aún estuviera en los años 80 o 90, y la optimización del software en términos de reducción de la cantidad de ciclos de reloj no plantea un problema particular: solo puede esperar un poco y los procesadores lo harán. mucho mas rápido.

Esto es cierto no solo para Microsoft, sino que me centraré en ejemplos específicos para ello. Joel Spolsky en su artículo menciona que Microsoft logró prevalecer sobre Lotus en los años 80 en la batalla entre Excel y 123 debido al hecho de que los gerentes de Lotus cometieron un error crítico: trataron de optimizar la aplicación. Específicamente, trataron de reducir la aplicación para que siempre garantizara que encajara en 640 KB de RAM. Lo mataron durante un año y medio, y durante este tiempo Redmond capturó el mercado utilizando Excel, ya que en ese momento estaban en funcionamiento computadoras con cantidades mucho mayores de RAM. Esta solución le costó mucho a Lotus.

Sin embargo, esto es lo interesante: en nuestros días, tal estrategia, tal vez, podría resultar una victoria, ya que los recursos de los sistemas de escritorio estándar ya no crecen a un ritmo tan sorprendente como hace 20-30 años. El problema es que, como resultado de la feroz competencia de ese período, las empresas que desarrollaron la funcionalidad de las aplicaciones fueron las ganadoras, ignorando el rendimiento y la optimización. Son estas compañías las que han formado esta ideología de desarrollo, cuyos frutos todavía estamos cosechando.

Inflación


¿A qué condujo esto? A un fenómeno muy curioso. Nunca renunciaré a las actualizaciones de hardware, pero de repente recientemente comencé a evitar las actualizaciones de software innecesariamente, debido a una posible inflación . Con este término, quiero decir que el mismo conjunto funcional que tenía en la versión anterior, en la nueva, obtengo un excelente precio en términos de recursos de procesador y RAM.

Hay un idioma constante en inglés, que en ruso suena como "tratar de arreglar algo que no se ha roto". La situación con el software en los últimos 10 años recuerda mucho a este idioma. Skype es uno de los mejores ejemplos de esto. A juzgar por los foros, este problema de memoria no existía en versiones anteriores de Skype, por ejemplo, en las versiones 3.x. ¿Qué ha mejorado en el producto desde entonces que se ha vuelto tan costoso en términos de RAM?

Lo mismo, por cierto, se aplica a varias aplicaciones de chat. Hace unos 15 años, el chat, que a la vez ocupa 30 MB de RAM, parecía una tontería. Sin embargo, ahora esto ya es la norma, aunque ¿qué nos proporcionan las salas de chat actuales, que no se proporcionaba en ese momento?

No te olvides de Microsoft Office. En mi opinión, la versión para XP satisfizo a todos. Por supuesto, como cualquier producto, tenía sus inconvenientes. ¿Pero fueron tan críticos que necesitaban lanzar las versiones 2007, 2010, etc.? Hago los mismos documentos en ellos, pero ahora tengo que esperar mucho más hasta que estos sistemas se inicien.

En justificación, escuchamos que las nuevas versiones contienen nuevas características. Sí, no lo niego, pero ¿no parece extraño que al hacerlo las viejas oportunidades requieran más recursos?

Modularidad y Optimización


Aún así, ¿por qué más recursos? Aquí todo se explica por el hecho de que la mayoría de las aplicaciones son bastante monolíticas. No, en términos de organización del código, probablemente se dividen en módulos con la división de responsabilidad correcta. Sin embargo, los llamo monolíticos en el sentido de que al cargar una aplicación, todos sus módulos generalmente se cargan de inmediato, aunque a menudo esto no es necesario.

Volveremos nuevamente a Skype. Ahora, obviamente, está hecho para que con un inicio de sesión simple, muchos módulos se carguen inmediatamente en la RAM, que son directamente responsables del sonido, el video, etc. Esto a pesar del hecho de que la entrada habitual requiere solo una lista de usuarios y la capacidad de intercambiar texto. Este sistema podría hacerse de manera diferente, cargando solo lo más necesario. Y solo cuando el usuario realmente quiere comenzar un intercambio de video, todo lo demás se carga.

La optimización también es importante, debido al hecho de que los desarrolladores son físicamente incapaces de desarrollar todo el código desde cero, pero se ven obligados a usar bibliotecas existentes que se escribieron sin mucha presión sobre la optimización.

Imagine que el desarrollador de cada biblioteca hace que su biblioteca sea un 5% más lenta de lo que podría haber sido si hubiera dedicado esfuerzos adicionales a la optimización. Deje que la biblioteca 1 use la biblioteca 2 en su trabajo, y esa biblioteca 3, y esa biblioteca 4. En este caso, una cadena de 15 bibliotecas en el caso de acumulación de retrasos obtiene el resultado 1.05 ^ 15 = 2.07, es decir en el peor de los casos, la aplicación se ejecutará dos veces más lento que cualquiera de los componentes.

Conozco bien la frase de que la optimización prematura es la raíz de todo mal. Sin embargo, esta es una optimización prematura, no optimización en absoluto. Este eslogan fue maravilloso en un momento en que los procesadores se volvían cada vez más rápidos frente a nuestros ojos. Después de llegar al techo, este eslogan comienza a cambiar de lado, cuando la versión anterior de la aplicación, escrita hace unos 15 años, de repente comienza a parecer más preferible que la versión lanzada la semana pasada. Por cierto, uno no puede dejar de notar el hecho de que a menudo los fabricantes de software intentan obligar a los usuarios a actualizar el software, precisamente porque no hay motivos especiales para el beneficio del consumidor en este caso.

Ejemplos alternativos


En principio, la industria del software espera lo mismo que la industria automotriz después de la crisis del petróleo de los años 70, cuando quedó claro que la gasolina se estaba convirtiendo en un recurso críticamente costoso. Desde entonces, las compañías automotrices han podido reducir el consumo del motor en aproximadamente un tercio, si no me equivoco.

En el mundo del software, también hay ejemplos de este tipo. En un momento, me gustó mucho Erlang, que se basa en el concepto de muchos procesos ligeros independientes que están unidos solo por mensajes comunes (esto le permite maximizar el uso de multinúcleo). Además, hay un principio en este entorno que se tomó prestado explícitamente de los intérpretes de LISP: que cada módulo y función se pueden cargar y volver a cargar sobre la marcha si es necesario (y lo mismo ocurre con cualquier proceso).

A modo de comparación, en Glassfish, si cambió una de varios cientos o miles de clases, debe reinstalar todo el módulo (war / ear / jar). El intercambio en caliente de funciones o clases sobre la marcha está ahí, pero se implementa muy mal en comparación con Erlang.

El futuro de la industria reside en las aplicaciones que pueden utilizar completamente la tecnología multinúcleo y no descargan de inmediato todos los módulos posibles para todas las funciones que se encuentran en este producto. Aquellos. el programa podrá cargar en la configuración básica y consumir tantos recursos como su predecesor consumió hace 15 años y, si es necesario, descargar todo lo que el usuario necesita sobre la marcha.

All Articles