Estoy usando una clase basada en registro en C++ para almacenar valores muy pequeños de punto flotante (ya que los valores de lo contrario van más allá del alcance de double
). Como estoy realizando una gran cantidad de multiplicaciones, esto tiene el beneficio adicional de convertir las multiplicaciones en sumas.¿Cómo puedo comparar el rendimiento de log() y la división fp en C++?
Sin embargo, en un cierto punto en mi algoritmo, necesito dividir un valor estándar double
por un valor integer
y hacer un valor basado en el registro *=
. He sobrecargado el operador *=
para mi clase basada en registro y el valor del lado derecho se convierte primero a un valor basado en registro ejecutando log()
y luego se agrega al valor del lado izquierdo. Por lo tanto, las operaciones realmente realizadas son división de coma flotante, log()
y suma de coma flotante.
Mi pregunta si sería más rápido convertir primero el denominador en un valor basado en el registro, que reemplazaría la división de coma flotante con resta de punto flotante, produciendo la siguiente cadena de operaciones: dos veces log()
, coma flotante resta, suma de punto flotante.
Al final, esto se reduce a si la división de coma flotante es más rápida o más lenta que log()
. Sospecho que una respuesta común sería que esto depende del compilador y de la arquitectura, así que diré que utilizo gcc 4.2 de Apple en darwin 10.3.0. Aún así, espero obtener una respuesta con un comentario general sobre la velocidad de estos dos operadores y/o una idea sobre cómo medir la diferencia yo mismo, ya que podría haber más cosas aquí, por ejemplo. ejecutando los constructores que hacen la conversión de tipo, etc.
¡Salud!
Ehh .. Micro-optimización? Ve por el que es más preciso. – kennytm
@KennyTM: sí, definitivamente micro-optimización, pero parece que esto tiene sentido en esta situación. –
Ejecútelo mil millones de veces en un ciclo desenrollado y cíelo, por Dios. Estas cosas no son cuestiones de opinión. –