2009-10-25 8 views
5

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

11

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.

+1

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

+1

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

+0

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? –

4

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.

+0

¿Algún comentario con el voto abajo? –

+2

Pero no corremos (directamente) en x86. C# amplía los bytes y los cortos para cada cálculo. –

+0

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

3

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.

3

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.

2

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.

Cuestiones relacionadas