viernes, 23 de octubre de 2009

Tipos y eficiencia

La correcta definición de tipos a la hora de programar requiere toda una investigación, es un tema profundo y conocer sus recovecos es bastante productivo.

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
%
byte0,20,00,536,20,317,17,7468,99,30,0
sbyte0,20,00,416,40,431,47,6460,010,210,0
short0,22,70,418,30,433,47,9487,420,2117,7
integer0,22,00,40,00,30,07,4450,421,3129,6
long0,336,60,543,61,6492,511,7765,239,0320,3
single0,24,01,8401,40,34,41,41,523,4152,4
double0,211,11,8404,10,33,91,40,041,1342,9
decimal2,81199,625,96995,97,72731,020,71435,6 ----
----
object1,5594,715,94247,92,6851,08,9555,630,7230,3

No hay comentarios:

Publicar un comentario