En mi opinión, podría escribirse un libro sobre el tema, y es un pilar fundamental en la temática de este blog.
Hoy en día hay muchos lenguajes que dan mucha libertad en la gestión de tipos: no hacen falta declararlos y realizan conversiones implícitas.
Esto, en ocasiones, es genial. Necesitamos un pequeño programa y lo resolvemos fácilmente, sin tan siquiera declarar previamente ninguna variable.
Pero a la vez, nos aleja de la perfección. Un buen programador conoce todos los detalles del lenguaje y los administra con sabiduría, para conseguir: Eficiencia, potencia, economía y elegancia. Un programa más rápido con un ordenador más lento, puro conocimiento.
En esta tabla vemos unos datos que reflejan tiempos en segundos y porcentajes.
La columna A, contiene los segundos que tardaron los diferentes tipos en asignar a una variable de dicho tipo un numero. Ejemplo z= 7 , siendo z byte, sbyte etc.
A la derecha de A, qué porcentaje de más tardó en realizar ese tipo la operación con respecto al que menos tiempo invirtió(el que menos tardó siempre está puesto a 0).
La columna B contiene los tiempos que tardo en incrementar y decrementar(consecutivamente) los diferentes tipos
La columna C contiene el tiempo en segundos que tardó en multiplicar esa variable por si misma.
La columna D contiene el tiempo que tardo en dividir la variable entre un número
La columna E contiene lo que tardo en redimensionar un array a 100 elementos y luego borrarlo
Cada una de las acciones anteriores fueron realizadas 10 millones de veces, para que dieran valores en décimas de segundos.
He utilizado Visual Studio .Net, y la propiedad timer para medir los tiempos. Básicamente he implementado una pequeña aplicación que realizaba 5 veces una repetición de 10M y obtenía una media de tiempos para los diferentes tipos.
Evidentemente no tenia ninguna otra aplicación abierta para que no afectara a los tiempos.
He repetido la prueba dos veces y se obtenían los mismo resultados.
Saquen conclusiones:
Tipo | A | % | B | % | C | % | D | % | E | % |
byte | 0,2 | 0,0 | 0,5 | 36,2 | 0,3 | 17,1 | 7,7 | 468,9 | 9,3 | 0,0 |
sbyte | 0,2 | 0,0 | 0,4 | 16,4 | 0,4 | 31,4 | 7,6 | 460,0 | 10,2 | 10,0 |
short | 0,2 | 2,7 | 0,4 | 18,3 | 0,4 | 33,4 | 7,9 | 487,4 | 20,2 | 117,7 |
integer | 0,2 | 2,0 | 0,4 | 0,0 | 0,3 | 0,0 | 7,4 | 450,4 | 21,3 | 129,6 |
long | 0,3 | 36,6 | 0,5 | 43,6 | 1,6 | 492,5 | 11,7 | 765,2 | 39,0 | 320,3 |
single | 0,2 | 4,0 | 1,8 | 401,4 | 0,3 | 4,4 | 1,4 | 1,5 | 23,4 | 152,4 |
double | 0,2 | 11,1 | 1,8 | 404,1 | 0,3 | 3,9 | 1,4 | 0,0 | 41,1 | 342,9 |
decimal | 2,8 | 1199,6 | 25,9 | 6995,9 | 7,7 | 2731,0 | 20,7 | 1435,6 | ---- | ---- |
object | 1,5 | 594,7 | 15,9 | 4247,9 | 2,6 | 851,0 | 8,9 | 555,6 | 30,7 | 230,3 |