0 votos
Hola Ramón, como ingeniero supongo que sabrás responderme estas preguntas. ¿ Qué es más eficiente, o lo que es lo mismo, qué gasta menos batería a la hora de ser computado?. Te pongo tres ejemplos:

- While vs Ciclo For.

He leído en algún sitio que era más eficiente usar siempre un while antes que un For, pero lo dijeron sin dar fundamento y puede que fuese pura palabrería.

-Pantalla en color negro vs blanco.

Yo pensaba que siempre que se mostrase el color negro en pantalla consumiría menos batería que una pantalla iluminada de color blanco, pero he leído de todo y no me queda claro.

-Asignar directamente vs Realizar un if.

En este caso, a veces, tengo que asignar un valor a una sola variable. Por ejemplo int x=0;

Siempre me queda la duda de si es más eficiente asignarlo directamente, sin importar si estuviese ya a 0, o comprobar antes el valor. Supongo que también dependerá de la longitud del número a guardar en la variable.

 

Saludos y espero que lo sepas porque me lo pregunto mucho y no sé cómo comprobarlo.
preguntado por chicocadiz Mar 28, 2015 en Android

1 Respuesta

0 votos
Mejor respuesta
Muy buenas preguntas. Han estado siempre en la duda de muchos programadores.

Decir con antelación que la respuesta depende del lenguaje, el dispositivo (Hardware) y del sistema operativo donde se ejecuten. También las respuestas que te voy a dar, pueden variar con el tiempo, la tecnología o incluso algunas de ellas con la opinión personal. Así que utilízalas de guía :)

En la universidad siempre han dicho, y es muy lógico, que el while es más óptimo que el for, pues el while su condición de parada no requiere hacer todos las iteraciones (por ejemplo una búsqueda, si encontramos un elemento en el while paramos; en el for se continuaría hasta terminar con todas las iteraciones). Si tuvieramos que hacer todas las iteraciones utilizaríamos for, pues está algo más optimizado si utilizamos bien las variables de los contadores y de obtener tamaños.

Lo de la pantalla depende del funcionamiento de los pixeles y de la iluminación. Casi siempre, si la pantalla es blanca, implica mayor luminosidad y que estén todos los píxeles encendidos (ver LCD y LED dinámicos); aunque existen pantallas dinámicas que ocurre justo lo contrario, que es el blanco el que no consume y el negro el que sí (ver LCD y LED estándar). No obstante, existen píxeles que no consumen más energía si el estado es blanco o negro (véase lectores de readers que no consumen energía cuando se mantiene el estado).

La última pregunta de asignar, entiendo que quieres decir inicializar. Siempre es mejor inicializar para controlar todos los estados (aunque sea a null). Luego puedes poner un if para comprobar el estado en cierto momento, solo necesario en ciertos casos.
respondido por Ramon [Admin] Mar 28, 2015
seleccionada por Ramon [Admin] Mar 29, 2015

Wau, gracias Ramón! Cómo me hubiera gustado poder hacer la carrera para aprender estas cosas.

Pues todo claro excepto el último punto. Te explico:

En la app que estoy haciendo, para uso propio y muy cutrecilla, uso las menos variables posibles para que no se me cuelgue el móvil (un galaxy  ace) por uso de memoria y que me consuma la menos batería posible. Había leído en algún foro lo de inicializar siempre las variables, aunque sea a null (aunque android studio creo que en alguna ocasión me ha dicho que inicializar a null es redundante). No sé el motivo real, y lo que comentas de controlar el estado no lo entiendo muy bien. Lo que si recuerdo que leí era que había que inicializar todas las variables para evitar problemas, por si acaso, y por un poco costumbre ya que en lenguajes de más bajo nivel  era costumbre inicializar siempre por no sé qué motivo.

A lo que voy. En mi app tengo una o dos variables int public que voy usando en las funciones. Esto lo hago con conocimiento, pues tengo pocas funciones que las usan y no  me voy a equivocar en el valor que tienen asignado. Pero a veces alguna de ellas se usa en dos funciones que trabajan casi solapadas y sí que tengo que asignarlas un valor específico.

Dependiendo del caso, esta variable puede que no se haya utilizado. Como no sé si la variable se ha utilizado o no, pues tengo dos opciones.

1 Pongo un if y si se ha cambiado el valor le asigno un valor que será fijo de 100, por ejemplo.

2 Le asigno el valor directamente, sin importar si es necesario cambiarle el valor o no.

En ese tipo de casos es en los que tengo la duda. ¿Es más efectivo comprobar primero o directamente asignar?. Personalmente pienso que un if es un ciclo más de proceso y consume más que asignar directamente, pero tengo la duda de qué es lo correcto y porqué.

 

Por cierto, y como curiosidad, me hice una app para manejo de archivos de mi móvil. En un edittext escribía lo que quería buscar y me devolvía los archivos que tenía.

Se me ocurrió que sería muy profesional que al ir escribiendo se fuera buscando y que te mostrase los resultados por pantalla. Funcionó bien con 10, 100 archivos, pero le metí 1.000 archivos al móvil y al ir a escribir en el edittext casi explota jeje. Lógicamente se me cerró la app. Por este tipo de cosas me como tanto la cabeza en lo de las variables y los ciclos.

Por último, que se me olvidó antes. ¿El uso de operadores ternarios es por eficiencia?

Se supone que estos dos códigos hacen lo mismo:

código que yo uso normalmente

    if (x>y)
    mayor = x;
    else
    mayor = y;
    
código ternario

mayor=(x>y)?x:y;

También me parece haber leído o escuchado en algún videotuto, que a los ingenieros os exigen escribir siempre el código imprescindible, por lo tanto en un examen el primer código estaría penalizado. Supongo que tendrá su razón de ser. Corrígeme si me equivoco


Un abrazo y gracias por tu tiempo.

En Java no es necesario inicilizar las variables, pues se inicilizan a null (salvo los int que se inicializan a 0). Lo recomendable es siempre inicializar para salir de dudas. Por ejemplo en PHP puede caber la duda de si una variable está a null (no apunta a ninguna posición de memoria) o a empty (apunta a una posición de memoria vacía), se inicializa y se sale de dudas.

Te explico lo de los estados. Una variable numérica en un momento de la ejecución del programa puede estar en un estado (por ejemplo 3) y en otro momento en otro estado diferente (por ejemplo 8). Si lo extrapolamos a objetos, un objeto en un estado inicial (al inicializar el objeto todas sus variables están con unos valores determinados) es diferente al de un estado más avanzado (al usar el objeto, las variables internas habrán cambiado, por tanto habrá cambiado el estado del objeto).

Dado un estado inicial de tu variable X (si la variable tiene un valor), no te hará falta el if porque ya sabes que va a ser X. Si el estado de la variable cambia a Y (la variable tiene otro valor diferente), tendrás que preguntar por ella. Dependerá de la lógica de tu programa si necesitas utilizar un if condicional o no. Como bien dices, el if consume algo que no realizar la condición y asignar directamente.

Lo de la App que no te buscara con muchos archivos, también puede que se debiera a que todo el trabajo lo estuviera haciendo el hilo principal. Aquí ya tienes que entrar con hilos, para que no haga todo el trabajo el hilo principal y Android te tumbe la aplicación (tienes más información en http://jarroba.com/asynctask-en-android/).
Sí, suponía que me haría falta un hilo para que no me cerrara la app. Aún así antes de que se cerrase en pruebas según subía de archivos iba haciéndose muy lentos los resultados al ser mostrados. Por eso lo descarté.

Gracias otra vez Ramón. Justo estaba editando el tema mientras me contestabas. Si eres de Madrid o Cádiz tienes una invitación a cerveza por ser tan majo! y lo digo en serio.
De nada, siempre que pueda ayudar echaré una mano. Me anoto la cerveza :D