Hice algunas pruebas de tiempo y también leí algunos artículos como este (último comentario), y parece que en la compilación de la versión, los valores flotantes y dobles toman la misma cantidad de tiempo de procesamiento.
¿Cómo es esto posible? Cuando el flotador es menos preciso y más pequeño en comparación con los valores dobles, ¿cómo puede el CLR duplicarse en el mismo tiempo de procesamiento?
c#
.net
clr
performance
Joan Venge
fuente
fuente
Respuestas:
En procesadores x86, al menos,
float
ydouble
la FPU convertirá cada uno a un valor real de 10 bytes para su procesamiento. La FPU no tiene unidades de procesamiento separadas para los diferentes tipos de punto flotante que admite.El antiguo consejo
float
es más rápido que el que sedouble
aplicó hace 100 años cuando la mayoría de las CPU no tenían FPU incorporadas (y pocas personas tenían chips FPU separados), por lo que la mayor parte de la manipulación de punto flotante se realizaba en software. En estas máquinas (que funcionaban con vapor generado por los pozos de lava), era más rápido usarfloat
s. Ahora, el único beneficio real de losfloat
s es que ocupan menos espacio (lo que solo importa si tiene millones de ellos).fuente
Tuve un pequeño proyecto en el que usé CUDA y puedo recordar que el flotador también era más rápido que el doble. Por una vez, el tráfico entre el Host y el Dispositivo es menor (el Host es la CPU y la RAM "normal" y el Dispositivo es la GPU y la RAM correspondiente allí). Pero incluso si los datos residen en el dispositivo todo el tiempo, es más lento. Creo que leí en alguna parte que esto ha cambiado recientemente o se supone que cambiará con la próxima generación, pero no estoy seguro.
Entonces, parece que la GPU simplemente no puede manejar la doble precisión de forma nativa en esos casos, lo que también explicaría por qué se usa generalmente GLFloat en lugar de GLDouble.
(Como dije, es solo por lo que puedo recordar, me encontré con esto mientras buscaba flotante frente a doble en una CPU).
fuente
Sin embargo, todavía hay algunos casos en los que se prefieren los flotadores; con la codificación OpenGL, por ejemplo, es mucho más común usar el tipo de datos GLFloat (generalmente mapeado directamente a un float de 16 bits) ya que es más eficiente en la mayoría de las GPU que GLDouble.
fuente
Depende del sistema de 32 o 64 bits . Si compila a 64 bits, el doble será más rápido. Compilado a 32 bits en 64 bits (máquina y sistema operativo) hizo flotar alrededor de un 30% más rápido:
fuente
Math
funciona con double. Pero leíste mal mi publicación: mis pruebas me mostraron un mejor rendimiento.float
y eldouble
son prácticamente idénticos. Menos del 0,3% de diferencia cuando se promedió en muchas pruebas independientes, donde cada prueba ejerció operaciones de multiplicación, división y suma en variables encadenadas consecutivamente (para evitar que las optimizaciones del compilador se interpusieran). Probé un segundo conjunto de pruebas conMath.Sin()
yMath.Sqrt()
y también obtuve resultados idénticos.