for loop - ejemplos - ¿Por qué siempre se utiliza un entero como la variable de control en un bucle for?
for en python 3 (6)
Acceder a un tamaño entero que es el mismo tamaño que el tamaño de la palabra nativa será el más eficiente. El uso de un byte casi seguramente requerirá tanto espacio como el tamaño de la palabra nativa y requerirá el desplazamiento y el enmascaramiento para acceder, por lo que no hay nada que ganar.
En términos prácticos, a menos que tenga un bucle muy, muy grande o restricciones de tiempo severas, no va a hacer mucha diferencia.
Pero como siempre, use lo que sea más legible, y haga una evaluación comparativa / perfil primero ...
A menudo, a veces se sabe con certeza que su bucle nunca se ejecutará más de x el número de veces en que x puede representarse con un byte o un byte, básicamente un tipo de datos más pequeño que int.
¿Por qué usamos int que ocupa 32 bits (con la mayoría de los idiomas) cuando algo como un byte sería suficiente, que es solo de 8 bits?
Sé que tenemos procesos de 32 y 64 bits, por lo que podemos obtener fácilmente el valor en un solo viaje, pero aún así consume más memoria. ¿O qué me estoy perdiendo aquí?
ACTUALIZACIÓN: Sólo para aclarar. Soy consciente de que en cuanto a la velocidad no hay diferencia. Estoy preguntando sobre el impacto en el consumo de memoria.
Casi siempre uso int
menos que haya una muy buena razón para no hacerlo, simplemente porque todos lo usan siempre. Esto es para evitar que el siguiente desarrollador tenga que dedicar tiempo a pensar. ¿Por qué no usó un int
aquí? ¿Hay alguna razón especial que deba conocer ?
Cuanto más estándar sea mi código, más fácil será leerlo en el futuro.
En C, una "int" se define como el tipo de entero más eficiente para la máquina actual.
Por lo general, coinciden con los registros de la CPU, así es como es más eficiente.
El uso de un tipo de valor entero más pequeño puede resultar en un cambio de bits o enmascaramiento de bits en el nivel de la CPU para que no obtenga ganancia ...
En muchos casos, el contador de bucles consume exactamente un registro de procesador. Cambiar el tipo a un entero de 8 o 16 bits no cambia eso, ya que los registros tienen un tamaño fijo (32 bits en una plataforma de 32 bits, etc.).
A veces, el contador de bucle puede colocarse en la memoria RAM, por ejemplo, cuando llama a una función desde el bucle. Entonces, sí, puede estar perdiendo algunos bytes, pero generalmente no lo suficiente como para preocuparse. De hecho, almacenar y cargar el contador de bucles puede ser más lento cuando se usa algo diferente de un int
.
En términos de la especificación del lenguaje Java, hay un punto interesante a tener en cuenta sobre el uso de long
y double
:
A los efectos del modelo de memoria del lenguaje de programación Java, una sola escritura en un valor largo o doble no volátil se trata como dos escrituras separadas: una para cada mitad de 32 bits. Esto puede dar lugar a una situación en la que un hilo ve los primeros 32 bits de un valor de 64 bits de una escritura y los segundos 32 bits de otra escritura. Las escrituras y lecturas de valores volátiles largos y dobles son siempre atómicas. Las escrituras y lecturas de referencias son siempre atómicas, independientemente de si se implementan como valores de 32 o 64 bits. Se recomienda a los implementadores de máquinas virtuales que eviten dividir sus valores de 64 bits cuando sea posible. Se recomienda a los programadores que declaren los valores compartidos de 64 bits como volátiles o que sincronicen sus programas correctamente para evitar posibles complicaciones.
Claramente, esto hace que el uso de una variable de bucle long
o double
sea menos eficiente que un int
en el modelo de memoria Java, pero las implementaciones pueden variar en el rendimiento.
Estoy tentado de agregar algo aquí, incluso si es un hilo muy viejo. No estoy totalmente de acuerdo con "Soy consciente de que la velocidad no tiene ninguna diferencia". De hecho, muy a menudo en el bucle for hay una matriz de indexación como en
for (i=0; i<len; i++) s = A[i]
Luego, incluso si su matriz tiene un tamaño inferior a 128, verá una notable diferencia de velocidad si i
es un int
o un byte
. De hecho, para realizar la aritmética de punteros en A[i]
el procesador debe convertir su entero en algo que tenga el mismo tamaño que un puntero. Si el entero ya tiene el mismo tamaño, entonces no hay conversión que induzca un código más rápido. En una máquina de 64 bits, parece que tengo un 20% de aceleración en los programas usando long int
para los índices de bucle en una matriz muy pequeña en lugar de char
(programas C / C ++).