2010-03-16 22 views
14

Todavía soy bastante nuevo así que tengan paciencia conmigo en este caso, mi pregunta (s) no debe ser argumentativa o mezquina, pero durante algunas lecturas algo me pareció extraño.Uso de diferentes tipos de variables numéricas

Supongo que cuando las computadoras eran lentas y la memoria era costosa con el tipo de variable correcto, era mucho más una necesidad de lo que es hoy en día. Ahora que la memoria es un poco más fácil de encontrar, la gente parece haberse relajado un poco. Por ejemplo, puede ver este código de ejemplo en todas partes:

for (int i = 0; i < length; i++) 

int? (-2,147,483,648 a 2,147,483,648) para la longitud? ¿No es byte (0-255) una mejor opción?

Así que estoy curioso de su opinión y de lo que cree que es la mejor práctica, odio pensar que esto sería utilizado solo porque el acrónimo "int" es más intuitivo para un principiante ... o la memoria se ha vuelto tan barata que realmente no tenemos que preocuparnos por cosas tan insignificantes y, por lo tanto, deberíamos utilizarlo por mucho tiempo para asegurarnos de que cualquier otro número/tipo (dentro de lo razonable) utilizado pueda ser lanzado automágicamente.

... o solo estoy siendo tonto al preocuparme por tales cosas?

+3

Definitivamente no es tonto, la curiosidad ayuda a construir un mejor programador. – ChaosPandion

Respuesta

10

Luca Bolognese publicó this en su blog.

Aquí está la parte pertinente:

  • Uso int cada vez que sus valores pueden caber en un entero, incluso para valores que nunca puede ser negativo
  • Uso de largo cuando sus valores no pueden caber en un int .
  • Byte, sbyte, short, ushort, uint y ulong solo deben usarse para la interoperabilidad con código C. De lo contrario, no valen la molestia.
2

Generalmente la memoria es barata en estos días, ya que no tiene que preocuparse por eso, puede preocuparse por detalles de programación más importantes. Piense en ello como administrar la memoria, cuanto menos tenga que hacer, más productivo es en general. En última instancia, tiene que ver con el nivel de abstracción, si no necesita controlar cómo funcionan todos los engranajes y ruedas, lo mejor es no jugar con ellos.

En la práctica generalmente siempre usará ints o longs (si necesita el tamaño extra). No me importaría nada menos en estos días a menos que estuviera optimizando. Y recuerde la regla de oro de la optimización No optimice a menos que sea necesario. Primero escriba su código y luego optimícelo si es necesario.

Otra situación similar ocurre cuando se diseña un esquema de base de datos. A menudo veo que las personas diseñan un esquema y permiten solo lo que necesitan en las columnas de NVARCHAR. Para mí esto es ridículo porque es una columna de longitud variable, por lo que no desperdicia espacio, y al darte suficiente espacio evitas problemas en el camino. Una vez trabajé para una empresa que tenía un registro interno en el sitio web; una vez que actualicé a IE8, el sitio web comenzó a fallar. Después de investigar, encontré que el esquema de registro solo permitía 32 caracteres para la cadena de id del navegador, pero al usar IE8 (con Vis Studio y otras extensiones) la cadena de id del navegador creció más allá de 32 y causó un problema que impedía que el sitio funcionara. . Claro que podría haber habido una verificación de longitud más estricta y un mejor manejo de errores por parte del desarrollador a cargo de eso, pero al permitir 256 en lugar de 32 no solo habría impedido la falla, sino que no estaríamos truncando los datos en el db.

No sugiero que use cadenas, e Int64 para todos sus tipos de datos (no más de lo que sugiero que configure todas sus columnas SQL a NVARCHAR (4000)) porque pierde legibilidad. Pero elige un tipo apropiado y darte mucho relleno.

+0

Recuerdo haber visto a alguien diseñar una columna como 'VarChar (11)'. ¿Qué sucede cuando tenemos un cliente que necesita 'VarChar (12)'? – ChaosPandion

9

El uso de una variable que es más pequeña que el tamaño del registro nativo de la CPU, en realidad puede dar como resultado que se emita más código.

Como dijo otro cartel, no se preocupe por las micro-optimizaciones. Si tiene un problema de rendimiento, primer perfil. 9 de cada 10 veces su problema de rendimiento no estará donde pensó que estaba.

3

No, no creo que estés siendo tonto, ¡esta es una gran pregunta!

Mi opinión es que el uso de variables fuertemente tipadas es una mejor práctica. En su ejemplo, la variable i siempre es positiva, por lo que podría ser sin signo int.

Al desarrollar programas, debemos tener en cuenta: 1) tamaño 2) velocidad y 3) el costo del programador. Estos no son mutuamente exclusivos, a veces intercambiamos el tamaño por la velocidad y, por supuesto, los que mejor pueden hacerlo (los grandes programadores) cuestan más que los principiantes.

Recuerde también qué es lo más rápido en la computadora X puede ser más lento en la computadora B. ¿Es un sistema operativo de 16 bits, 32 bits, 64 bits, etc.? En muchos casos, queremos que una variable se alinee con los límites de las palabras para la velocidad, de modo que el uso de variables más pequeñas que una palabra no termine guardando ningún espacio.

Así que no es necesario es mejor usar la variable más pequeña posible, pero siempre es una buena práctica hacer una elección informada sobre el mejor tipo de uso.

2

Las variables locales, como los índices de ciclo, son baratas. ¿Cuántos marcos va a tener en la pila a la vez? ¿Cincuenta? ¿Un centenar? ¿Mil? ¿Cuál es la sobrecarga de usar mil contadores int en lugar de mil contadores byte? 3K? ¿Vale la pena rehacer el trabajo de 3K cuando resulta que un par de esas matrices necesita más de 255 elementos?

Si está asignando decenas de millones de estas cosas, apretar el conteo de bits puede tener sentido. Para los locales, es una economía falsa.

Otro factor es lo que el tipo comunica a sus lectores. Para bien o para mal, las personas ponen muy poca interpretación en un int; pero cuando ven un byte tienden a interpretarlo como algo específicamente orientado a bytes, como datos binarios que provienen de una secuencia, tal vez píxeles, o una secuencia que debe ejecutarse a través de un codificador para convertirlo en una cadena. Usar un byte como contador de bucles hará que muchos lectores de tu código se salgan de su camino cuando se detengan y se pregunten: "Espera, ¿por qué es esto un byte en lugar de un int?"

2

Teniendo en cuenta esta nota puede ayudarle a:

El tiempo de ejecución optimiza el rendimiento de tipos de enteros de 32 bits (Int32 y UInt32), a fin de utilizar esos tipos de contadores y otra de acceso frecuente las variables integrales . Para las operaciones de punto flotante , Double es el tipo más eficiente porque las operaciones están optimizadas por hardware.

fuente: MCTS Self-Paced Training Kit (Exam 70-536): Microsoft® .NET Framework Application Development Foundation, Second edition

Nota: Creo que esto está bien para máquinas x86, x64, pero para que no sé.

Cuestiones relacionadas