¿Vale la pena la microoptimización en dispositivos móviles?


8

Por lo general, se considera que la microoptimización no vale la pena con la siguiente explicación: podría acelerar el programa en menos de un uno por ciento, pero a nadie le importa ese pequeño impulso, eso es un cambio demasiado pequeño como para notarlo.

Además, puede haber algún controlador de eventos que se dispare mil veces por segundo y salga muy rápido, antes de que se vuelva a disparar. A nadie le importa lo rápido que sea, no se puede notar que sea más rápido, porque ya "es tan rápido como se puede observar".

Sin embargo, en dispositivos móviles, el consumo de energía es un factor importante. El mismo controlador de eventos optimizado para funcionar un diez por ciento más rápido conducirá a una menor consumo de energía y una mayor duración de la batería y un dispositivo operativo más largo.

¿Cuán preciso es el último juicio sobre los dispositivos móviles? ¿Hay ejemplos de la vida real que lo confirmen o refuten?


3
En mi humilde opinión, al igual que con la optimización en general, solo puede obtener una respuesta confiable a través de mediciones. Pero la pregunta es buena, sin embargo, +1 :-)
Péter Török

1
Define tus términos. Tengo la impresión de que estás hablando de micro-optimización en tiempo de ejecución, y mencionas específicamente el uso de energía, pero en el contexto de dispositivos pequeños, esas no son las únicas cosas que podrían valer la pena optimizar. El tamaño ejecutable y la huella de memoria son otros.
Peter Taylor

Respuestas:


12

Vale la pena si las mediciones dicen que vale la pena. Para dispositivos móviles y supercomputadoras.

EDITAR: poco fuera del tema, pero sobre su ejemplo. Si el evento se desencadena demasiadas veces, entonces tienes un problema de concepción, y resolver ese problema de concepción es el verdadero negocio. No lo hace menos visible por microoptimización.

Puede realizar una prueba en la devolución de llamada, por ejemplo, para descartar llamadas demasiado frecuentes o reelaborar la forma en que se llama la devolución de llamada.

En general, es una mala práctica adjuntar la devolución de llamada a «eventos continuos». Con eso, me refiero a los eventos que no se activan una vez y luego se hacen, pero que se activan con acciones que duran con el tiempo.

Desplazarse por una página o un control deslizante, por ejemplo, son eventos continuos.

Nunca se sabe cuántas veces se activarán esos eventos. Si se activan lo suficientemente rápido, su aplicación se vuelve lenta, y si se activan demasiadas veces, terminará con una gran carga de CPU por nada, lo que podría hacer que su aplicación también sea lenta.


De acuerdo, ¿qué mido: consumo de energía o cualquier otra cosa?
Sharptooth

44
Mida lo que le importa a su usuario. Si el consumo es un problema (y está en un dispositivo móvil), mídalo y actúe de acuerdo con las mediciones.
deadalnix

¿Qué pasa con las consideraciones comerciales? ¿Es rentable hacer la optimización? Una batería más grande podría ser más barata que el tiempo de ingeniería para productos de volumen medio bajo. Una interfaz de usuario más lenta con un 5% menos de duración de la batería es mejor que ningún producto en el mercado. Es fácil quemar $$$ sin lograr la perfección.
mattnz

2

¿Cuán preciso es el último juicio sobre los dispositivos móviles?

Es tan preciso como las mediciones reales en el dispositivo real que realmente indican que la optimización real realmente ayudará.

Las suposiciones y juicios no tienen valor.

Las medidas tienen valor.

Toda optimización (incluida la "microoptimización", sea lo que sea) es una pérdida de tiempo hasta que haya una medición real que indique un problema real en el que el código no cumpla con algún requisito (velocidad, memoria, potencia o latencia de red o lo que sea )


2

(Asumir que la velocidad es su problema principal). Todos tienen razón.
Excepto: la medición no le dirá qué optimizar.

La medición le indicará que necesita optimizar.
La medición le indicará cuánto ahorró cuando optimizó.

La medición no le dirá qué optimizar.
Esta técnica le dirá qué optimizar.


2
¿No es mejor el perfil que esta técnica de muestreo aleatorio?
S.Lott

2
@ S.Lott q: ¿es mejor ver el mural a dos cuadras de distancia que verlo a dos pies de distancia? a: realmente no ves el mural cuando lo ves desde una sola perspectiva. Ambos son importantes. el muestreo / perfil puede ser una gran pérdida de tiempo si esa es la única perspectiva que alguna vez toma para evaluar el rendimiento de su programa.
Justin

@Justin: "muestrear / perfilar puede ser una gran pérdida de tiempo si ..."? ¿Qué? Usted proporcionó un enlace sobre muestreo, como si la elaboración de perfiles no fuera tan buena como el muestreo. ¿Ahora estás diciendo que ambos son potencialmente malos? ¿Cuál es la tercera opción, diferente del muestreo en el enlace y el perfil (que me parece más completo y útil)? Si hay una tercera opción, ¿podría actualizar su respuesta para explicar cómo encajan todas estas opciones? Todavía no estoy claro qué hay de malo con la creación de perfiles. El enlace no explica por qué el muestreo es mejor.
S.Lott

@ S.Lott: Bueno, sé que es una opinión minoritaria, pero varias personas lo han intentado y están de acuerdo. Si puedo hacer una analogía, los arqueólogos usan herramientas manuales y pinceles, porque los detalles finos son importantes y necesitan comprenderlos. El único perfilador que conozco que se acerca es Zoom . Y si lo prueba, verá que sigue siendo bastante diferente, porque se concentra en la comprensión . Es el método usado aquí .
Mike Dunlavey

@ Mike Dunlavey: "¿Lo he probado y estoy de acuerdo"? ¿Qué es? ¿Muestreo? Perfilado? ¿O sea la tercera opción cuando "muestrear / perfilar puede ser una gran pérdida de tiempo si ..."? ¿Estás diciendo que la creación de perfiles funciona? ¿O la elaboración de perfiles requiere herramientas especiales?
S.Lott

1

Estoy familiarizado con la optimización. Veo los programas de otras personas con un par de ojos diferentes. Aquí está mi opinión:

Por lo general, se considera que la microoptimización no vale la pena con la siguiente explicación: podría acelerar el programa en menos de un uno por ciento, pero a nadie le importa ese pequeño impulso, eso es un cambio demasiado pequeño como para notarlo.

Lo curioso es que uno de esos cambios conduce al 99%. Diez de estos cambios hacen que el programa sea notablemente más rápido. Para muchos ingenieros, los cambios en su enfoque de escribir un programa pueden hacer que un programa se ejecute varias veces más rápido. Simplemente estar al tanto de la eficiencia y escribir de esa manera puede hacer que su programa sea varias veces más rápido sin mucho trabajo adicional. tales ganancias no son micro optimizaciones, en mi opinión.

nota: nunca estoy sugiriendo optimizaciones contextuales que corten las esquinas en esta discusión.

Además, puede haber algún controlador de eventos que se dispare mil veces por segundo y salga muy rápido, antes de que se vuelva a disparar. A nadie le importa lo rápido que sea, no se puede notar que sea más rápido, porque ya "es tan rápido como se puede observar".

y es probable que ya esté haciendo más trabajo del necesario, ya que 1 kHz es mucho más alto de lo que requieren muchos casos. ¿Cuál es la fuente de este controlador de eventos y cuáles son sus efectos? si se trata simplemente de actualizar la interfaz de usuario y los eventos se pueden recopilar y fusionar, entonces el envío de 1 kHz es ciertamente excesivo (mucho más del 1%, más como 25x). para un sistema que tiene múltiples fuentes y se transmite en serie, entonces 1 kHz puede no ser lo suficientemente rápido (por ejemplo, MIDI).

Sin embargo, en dispositivos móviles, el consumo de energía es un factor importante. El mismo controlador de eventos optimizado para funcionar un diez por ciento más rápido conducirá a una menor consumo de energía y una mayor duración de la batería y un dispositivo operativo más largo. ¿Cuán preciso es el último juicio sobre los dispositivos móviles? ¿Hay ejemplos de la vida real que lo confirmen o refuten?

Según los programas que he visto, no hay muchas personas considerando (o preocupadas) tales optimizaciones, a pesar de que cambiar su enfoque para escribir programas puede producir ganancias increíbles (> 10 veces o mucho más rápido). muchos de los que he visto (en el lado del desarrollo de aplicaciones) simplemente escriben y luego adoptan un enfoque de arriba hacia abajo o "granizo" cuando (/ si) los problemas de rendimiento los alcanzan. Del mismo modo, muchos ni siquiera se tomarán el tiempo para perfilar hasta tal ocurrencia. para entonces, el ruido de tantas ineficiencias compuestas hace que sea muy difícil obtener información útil de un generador de perfiles. ejemplos del enfoque de granizo sería optimizar las áreas equivocadas (con o sin buscar áreas problemáticas), o simplemente arrojar más núcleos en las áreas problemáticas; Esto sucede en lugar de corregir las ineficiencias existentes.

Para el programa existente típico (entre los programas móviles que he visto), la optimización no era una gran preocupación cuando se escribe. por lo tanto, "sí" valen (en el caso típico) el tiempo, siempre que esté en el presupuesto y sea una prioridad. en ese caso, esos diez cambios que hacen que el programa sea notablemente más rápido probablemente se puedan realizar en unas pocas horas y en menos de un día.

"escribir perezosamente y perfilar en retrospectiva" ya que la única acción para mejorar un programa es una idea terrible: tomarse el tiempo para aprender a escribir un programa eficiente (como está escrito, no pegándolo al final) es el superior enfoque (imo); use los algoritmos correctos, prohíba las copias innecesarias, las asignaciones, los cálculos (+ muchas, muchas otras categorías). por supuesto, analizar el rendimiento en retrospectiva tiene sus ventajas, pero si escribe el programa para que sea eficiente desde el principio, tendrá un nivel completamente nuevo de eficiencia porque aprende mucho y considera y evalúa la ejecución desde múltiples perspectivas.

La otra cosa es que los programas deben (a menudo) escribirse para su reutilización, un programa mal escrito introducirá cambios que pueden romper los programas de los clientes cuando se eliminan las ineficiencias (o simplemente seguir siendo ineficientes para evitar romper los programas existentes).

Una gran ventaja de considerarlo cuando escribe es que tiene una idea muy clara de cómo funcionará el programa (aunque no es una imagen completa), puede usar esta información para ayudar en el diseño de las interfaces y cómo almacena sus datos . la verdad es que un ingeniero puede implementar algo que es varias (por ejemplo,> 10 veces) más rápido que las soluciones estándar de "talla única" que se proporcionan con el sistema operativo.

Finalmente, también vale la pena más allá de los dispositivos móviles. Hay muchos programas ineficientes, escritos con la mentalidad de que el hardware será más rápido en dos años (razón frecuente, ¡incluso para programas escritos hoy!). Si bien eso no es incorrecto , es demasiado optimista. también, la paralelización tiene un propósito, pero es la "solución predeterminada" incorrecta para muchos programas. Muchos de estos programas existentes pueden mejorarse mejor eliminando primero las ineficiencias existentes.

entonces ... típicamente hay una tonelada de esos casos del 1%, 2%, 7% (y mucho peor) en el mundo real. corregirlos o (más importante) no escribirlos / exponerlos en primer lugar puede proporcionar grandes beneficios. Muchos de esos casos pueden localizarse y corregirse fácilmente (siempre que el ingeniero tenga experiencia con esto). Sin embargo, puede ser realmente un dolor corregir y volver a probar después del hecho. si un programa es óptimo, idealmente se escribirá de esa manera desde el principio.

Como usuario final, es irritante esperar continuamente programas lentos y lanzar el doble de hardware a los problemas creados por programas lentos / ineficientes: P: "¿qué va a hacer ahora que tiene el doble de núcleos y el doble de memoria?" R: "recupere la capacidad de respuesta y la productividad que tenía antes de actualizar mi software, eso es todo". bastante desconsiderado del desarrollador (en mi humilde opinión).


1
Tomarse el tiempo para hacerlo perfecto es un lujo agradable para algunos. Una empresa que conocía de micro-optimizado su salida del negocio. El producto de su competencia era inferior en todos los sentidos, más lento y necesitaba recargarse más a menudo da da da, pero era posible que un usuario comprara uno a un precio que el usuario estaba dispuesto a pagar .....
mattnz

@mattnz un buen ejemplo (+1). para que conste, no estoy defendiendo un programa perfecto. mi publicación enfatizó un buen diseño con mayor énfasis y consideración por el rendimiento de lo que es típico. en defensa de los costos: a menudo puede lograr un buen equilibrio entre un programa bien escrito que funciona bien con componentes que pueden reutilizarse fácilmente frente a un diseño pobre / ineficiente que termina teniendo una vida útil relativamente corta. uno debe tener en cuenta los costos de mantenimiento y reconocer las fortalezas y debilidades de cada diseño. (cont)
justin

(cont.) las buenas implementaciones tienden a ser reutilizables y tienen una larga vida, mientras que los programas mal escritos se enfrentan a la obsolescencia antes y a menudo requieren altos costos de mantenimiento (por ejemplo, depuración, ajuste, reescritura, reevaluación antes y después del envío). los programas mal escritos son a menudo una mayor pérdida de tiempo / recursos de desarrollo a largo plazo.
Justin

1

La razón por la que no debería molestarse con las micro optimizaciones es que son micro optimizaciones. Debería mirar la imagen más grande y, en lugar de perder el tiempo en micro optimizaciones, encontrar razones para mejoras reales .

Mi regla general es que cualquier código escrito sin tener en cuenta la velocidad, pero tampoco totalmente estúpido, puede hacerse diez veces más rápido con mucho esfuerzo. El 10% a través de micro optimizaciones no es algo con lo que me molestaría. Estoy seguro de que puede ahorrar mucho más que eso, con menos esfuerzo.

Por otro lado, en los productos comerciales en los últimos años, la "optimización" para mí consistió principalmente en encontrar código que perdiera el tiempo y no desperdiciarlo. Más falta de pesimismo que optimización.

(Por otro lado, algunas personas piensan que la optimización prematura es mala, por lo que si hay una forma de A para hacer algo y una forma B que es menos eficiente, elegirán B porque A es "optimización prematura" Algunas personas son simplemente estúpidas).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.