Siempre me gusta usar la variable con el tamaño más pequeño que funcionará bien, pero ¿realmente me ganaría si utilizara enteros de bytes cortos en lugar de enteros, y la memoria tiene una dirección de 32 bits, hace el compilador algo para mejorar uso de memoria ?¿Por qué usar enteros menores que 32 bits?
Respuesta
Para las variables locales, probablemente no tenga tanto sentido, pero si utiliza enteros más pequeños en las estructuras donde tiene miles o incluso millones de elementos, puede ahorrar una cantidad considerable de memoria.
No, int
fue elegido para ser el tipo int más rápida para las arquitecturas mopdern 32/64 bits, utilizando menor rendimiento (short
, sbyte
) tipos sólo le costará.
En ocasiones, puede ahorrar memoria, pero solo cuando se utilizan grandes arreglos o listas. E incluso entonces, generalmente no paga.
Cálculo con 8 bits:
sbyte a, b, c;
a = (sbyte) (b + c);
Se requiere que el encasillado y conlleva un coste de tiempo de ejecución.
¿Algún comentario con el voto abajo? –
Pero no corremos (directamente) en x86. C# amplía los bytes y los cortos para cada cálculo. –
Por cierto, no voté por ti ... simplemente estoy comentando ... pero mi opinión al respecto es que tu respuesta no fue del todo correcta en las afirmaciones de rendimiento. Además, puede guardar mucha memoria en estructuras que no están solo en matrices o listas. Por ejemplo, trabajamos en juegos con grandes mundos en 3D con literalmente decenas o cientos de miles de objetos conectados libremente en un gráfico dirigido (uno de nuestros juegos carga alrededor de 200,000 objetos).Los tamaños de variable realmente importan para el rendimiento y la memoria. – Adisak
Si se trata de una variable simple, no se gana nada al usar un ancho más corto, y se puede perder algo de rendimiento. El compilador ampliará automáticamente el almacenamiento a una palabra de procesador completa, por lo que incluso si solo declara 16 bits, es probable que tome 32 bits en la pila. Además, el compilador puede necesitar realizar ciertas operaciones de truncamiento en algunos casos (por ejemplo, cuando el campo es parte de una estructura); estos pueden causar una ligera sobrecarga.
Realmente solo importa para estructuras y matrices, es decir, si tiene muchos valores. Para una estructura, puede guardar algo de memoria, a expensas de los gastos generales que mencioné anteriormente. Además, puede verse obligado a usar un tamaño más pequeño si la estructura necesita seguir un diseño externo. Para una matriz, el ahorro de memoria puede ser relevante si la matriz es grande.
Normalmente, se adhieren con int
etc.
Además de las otras respuestas; también hay casos en los que intencionalmente solo desea admitir el tamaño de datos dado, ya que representa una verdad clave sobre los datos. Esto puede ser clave cuando se habla con sistemas externos (en particular interoperabilidad, pero también bases de datos, formatos de archivo, etc.), y puede combinarse con checked
aritmética, para detectar desbordamientos lo antes posible.
Para ser honesto, el consumo de memoria probablemente no sea la razón más convincente para usar pequeños datos (en este ejemplo). Pero hay un principio general en juego que dice que sí, debes usar solo la memoria requerida para tus estructuras de datos.
El principio es esto, asigne solo el ancho que requieren sus datos y permita al compilador encontrar cualquier error de desbordamiento que pueda ocurrir, es una técnica de depuración adicional que es muy efectiva. Si sabe que un valor nunca debe exceder un umbral, entonces solo asigne hasta ese umbral.
- 1. 64 bits por división de 32 bits
- 2. enteros de 32 bits sin signo en Javascript
- 3. ¿Por qué debería usar el JDK de 64 bits en la versión de 32 bits?
- 4. multiplicación SSE de 4 enteros de 32 bits
- 5. ¿Alguna razón para usar enteros de 32 bits para operaciones comunes en la CPU de 64 bits?
- 6. ¿Qué tiene de malo cambiar 32 bits de una variable de 32 bits?
- 7. Qué comando usar para comprobar si python es de 64 bits o de 32 bits
- 8. ¿Por qué __sync_add_and_fetch funciona para una variable de 64 bits en un sistema de 32 bits?
- 9. ¿Por qué los desarrolladores .NET ofrecen versiones de 32 bits/64 bits de ensamblados .NET?
- 10. ¿Por qué la MSBuild de 64 bits carga extensiones de 32 bits?
- 11. ¿Por qué los fixnums en Emacs solo son 29 bits?
- 12. Configurar Launch4J para usar JVM de 32 bits solamente
- 13. ¿Por qué sizeof (string) == 32?
- 14. Windows 7 64 bits incorrecta PATH al cargar la biblioteca de 32 bits para 32 bits exe
- 15. conversión de aplicación .NET 32 bits a 64 bits
- 16. ¿Por qué una int en OCaml solo tiene 31 bits?
- 17. Mathematica: determina si todos los enteros en una lista son menores que un número.
- 18. Qué tipos de enteros usar para enteros de datos centrales
- 19. ¿Qué versión de Eclipse debo ejecutar en OSX? ¿32 bits o 64 bits?
- 20. Cómo hacer que Xvfb funcione en color de 32 bits
- 21. Registros de 64 bits en ventanas de 32 bits
- 22. ¿Por qué y cuándo utilizar PowerShell o ISE de 32 o 64 bits?
- 23. Cómo compilar para 32 bits con Eclipse
- 24. QtCreator en Linux: 32 bits frente a 64 bits
- 25. Objeto compartido/bibliotecas mixtas de 32 bits y 64 bits
- 26. ¿Hay alguna manera de multiplicar correctamente dos enteros de 32 bits en Javascript?
- 27. ¿Hay una penalización de rendimiento que acceda a una matriz de enteros de 32 bits en x86-64?
- 28. #ifdef para plataforma de 32 bits
- 29. ¿Cómo clasificaría 1 millón de enteros de 32 bits en 2MB de RAM?
- 30. uint es de 32 bits, sin importar si el sistema es de 32 o 64 bits?
FWIW, en una PC en modo de 32 bits, las entradas de 16 bits pueden ser un poco más lentas que las de 32 bits porque los códigos de máquina realmente requieren un byte adicional para especificar que usan operandos de 16 bits. Por lo tanto, para las variables locales, use el tipo int nativo si le funciona. De nuevo, para estructuras, para ahorrar memoria, use lo que sea que el tamaño más pequeño funcione. Es posible que desee agrupar variables miembro por tamaños similares, de modo que no pierda espacio con el relleno entre variables de miembros de diferentes tamaños. – Adisak
Por cierto, aquí hay un artículo llamado "Dominio de estructuras en C#" que describe en profundidad * EXACTAMENTE * lo que estaba diciendo sobre la agrupación de variables del mismo tamaño: http://www.vsj.co.uk/articles/display.asp?id= 501 – Adisak
Me gustó el enlace, muy informativo y me gustaría saber, ¿Cómo obtendré una ganancia similar con las matrices, será algo así como Estructuras? –