Estoy haciendo un trabajo crítico para el rendimiento en C ++ y actualmente estamos usando cálculos de números enteros para problemas que son inherentemente de punto flotante porque "es más rápido". Esto causa muchos problemas molestos y agrega mucho código molesto.
Ahora, recuerdo haber leído sobre cómo los cálculos de coma flotante eran tan lentos aproximadamente alrededor de los 386 días, donde creo (IIRC) que había un coprocesador opcional. Pero seguramente hoy en día, con CPUs exponencialmente más complejas y potentes, no hay diferencia en la "velocidad" si se hace un cálculo de punto flotante o entero. ¿Especialmente porque el tiempo de cálculo real es pequeño en comparación con algo como causar un bloqueo de la tubería o recuperar algo de la memoria principal?
Sé que la respuesta correcta es comparar el hardware de destino, ¿cuál sería una buena manera de probar esto? Escribí dos pequeños programas en C ++ y comparé su tiempo de ejecución con el "tiempo" en Linux, pero el tiempo de ejecución real es demasiado variable (no ayuda, estoy ejecutando en un servidor virtual). Aparte de pasar todo el día ejecutando cientos de puntos de referencia, haciendo gráficos, etc., ¿hay algo que pueda hacer para obtener una prueba razonable de la velocidad relativa? ¿Alguna idea o pensamiento? ¿Estoy completamente equivocado?
Los programas que utilicé de la siguiente manera, no son idénticos de ninguna manera:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <time.h>
int main( int argc, char** argv )
{
int accum = 0;
srand( time( NULL ) );
for( unsigned int i = 0; i < 100000000; ++i )
{
accum += rand( ) % 365;
}
std::cout << accum << std::endl;
return 0;
}
Programa 2:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <time.h>
int main( int argc, char** argv )
{
float accum = 0;
srand( time( NULL ) );
for( unsigned int i = 0; i < 100000000; ++i )
{
accum += (float)( rand( ) % 365 );
}
std::cout << accum << std::endl;
return 0;
}
¡Gracias por adelantado!
Editar: La plataforma que me importa es x86 o x86-64 normal que se ejecuta en máquinas de escritorio Linux y Windows.
Edición 2 (pegado de un comentario a continuación): Actualmente tenemos una base de código extensa. Realmente me he encontrado con la generalización de que "no debemos usar float ya que el cálculo de números enteros es más rápido", y estoy buscando una manera (si es que esto es cierto) para refutar esta suposición generalizada. Me doy cuenta de que sería imposible predecir el resultado exacto para nosotros sin hacer todo el trabajo y perfilarlo después.
De todos modos, gracias por todas sus excelentes respuestas y ayuda. Siéntase libre de agregar cualquier otra cosa :).
float
obtiene el aumento de velocidad, pero generalmente double
no lo hace.
addl
reemplazado porfadd
, por ejemplo). La única forma de obtener una buena medición es obtener una parte central de su programa real y perfilar diferentes versiones de eso. Desafortunadamente, eso puede ser bastante difícil sin usar toneladas de esfuerzo. Quizás decirnos el hardware de destino y su compilador ayudaría a la gente al menos a brindarle experiencia preexistente, etc. Sobre su uso de enteros, sospecho que podría crear una especie de clase defixed_point
plantilla que facilitaría enormemente ese trabajo.