2009-10-22 7 views
9

Trate de ver qué elenco es más rápido (no es necesario que sea mejor): nuevo caso de C++ o viejo elenco de estilo C de la moda. ¿Algunas ideas?que emiten es más rápido static_cast <int>() o int()

+1

siempre puede escribir una secuencia de comandos de referencia. Solo haz 10 millones de static_cast y 10 millones de int de lanzamiento, y mira cuál lleva más tiempo. mi * conjetura * es que compilarán con la misma instrucción de ensamblaje. – Kip

+12

Sin tener en cuenta el hecho de que casi con seguridad compilan lo mismo en todos los compiladores, ¿por qué sería esto importante? A menos que tenga problemas conocidos de rendimiento, escriba para que sea claro y evite microoptimizaciones difíciles de leer que, de todos modos, son inútiles. Utilice static_cast (). –

+3

Los moldes de estilo C se definen en términos de moldes de estilo C++ (y los moldes de estilo c pueden enviarse a bases privadas ...). Entonces, en realidad son bastante equivalentes. nadie tiene un impulso de rendimiento sobre el otro. –

Respuesta

33

No debería haber ninguna diferencia si compara int() con equivalente funcionalidad de static_cast<int>().

Usando VC2008:

double d = 10.5; 
013A13EE fld   qword ptr [[email protected] (13A5840h)] 
013A13F4 fstp  qword ptr [d] 
    int x = int(d); 
013A13F7 fld   qword ptr [d] 
013A13FA call  @ILT+215(__ftol2_sse) (13A10DCh) 
013A13FF mov   dword ptr [x],eax 
    int y = static_cast<int>(d); 
013A1402 fld   qword ptr [d] 
013A1405 call  @ILT+215(__ftol2_sse) (13A10DCh) 
013A140A mov   dword ptr [y],eax 

Obviamente, es 100% igual!

+8

+1. El montaje siempre es bueno para tales cosas. – Joey

+0

Esto no me parece sexy :) Una sexy usaría instructivos SSE sin involucrar a la FPU en absoluto :) (Pensé que SSE ya se usaba por defecto en VC). – AnT

+0

@AndreyT :) El código en la respuesta se produjo en modo de depuración. Si intenta compilarlo con optimizaciones, usa instrucciones SSE. – AraK

2

Eche un vistazo al ensamblaje con cada método. Si es diferente, use un perfilador.

1

Son los mismos que se resuelven durante el tiempo de compilación y no hay sobrecarga de tiempo de ejecución. Incluso si hubiera alguna diferencia, realmente no me molestaría demasiado con estas pequeñas (ni siquiera micro) optimizaciones.

3

No hay diferencia en absoluto.

Cuando se trata de tales construcciones básicas como un único molde, una vez que dos construcciones tienen el mismo significado semántico, su performace será perfectamente idénticos, y el código de máquina generado para estas construcciones será el mismo.

-2

Cuando su elección hace poca diferencia en el código, elegiría el que les parezca más familiar a los programadores posteriores. Hacer código más fácil de entender por los demás siempre vale la pena considerarlo. En este caso, me quedaría con int(…) por ese motivo.

+0

¿Por qué supondrías que int (...) te resultará más familiar? En realidad, parece no ser válido en C, siendo tal vez una llamada de "pseudo constructor" de C++. - Además, al no ser explícito sobre el tipo de elenco, ¿por qué debería hacer que el código sea más fácil de entender? – UncleBens

+0

Los moldes no son nada con los que se pueda jugar y, por lo tanto, deberían ser fáciles de detectar. Eso es lo que son los moldes de estilo C++. – foraidt

3

Creo que el resultado real es la implementación definida. Debería verificarlo en su versión del compilador. Pero creo que dará el mismo resultado en la mayoría de los compiladores modernos. Y en C++ no debe usar C-cast, en su lugar use C++ casts - le permitirá encontrar errores en tiempo de compilación.

+0

+1 por mencionar comprobaciones en tiempo de compilación – foraidt

+0

Los problemas de rendimiento no están definidos por la implementación (de hecho, el estándar no exige ningún rendimiento, aparte de big-O para operaciones de contenedor) –

0

Como la mayoría de la gente dice que uno espera que estos tengan la misma velocidad, aunque estés a merced de tu compilador ... y esa no siempre es una situación muy feliz. Sigue leyendo para historias de guerra.

Dependiendo de su compilador y el modelo particular de núcleo de procesador que ejecuta el programa de la velocidad de float f; int i(f);, float f; int i = (int)f; y float f; int i = static_cast<int>(f); y sus semejantes (incluyendo las variaciones que implican tipos dobles, largos y sin signo) puede ser atrociously lento - un orden de magnitud peor de lo esperado El compilador puede emitir instrucciones que alteran los modos internos del procesador, lo que hace que las tuberías de instrucciones se descarten. Esto es, en efecto, un error en el elemento de optimización del compilador. He visto casos en los que uno sufre el tipo de costos de 40 ciclos de reloj mencionados en this analysis, en cuyo punto tiene un cuello de botella de rendimiento importante, inesperado e irritante con AFAIK ninguna solución genérica totalmente agradable, robusta. Hay alternativas que implican al ensamblador pero AFAIK no redondean el punto flotante al entero de la misma manera que los moldes. Si alguien sabe algo mejor, estoy interesado. Espero que este problema se confine en breve a los compiladores/hardware heredados, pero necesita su ingenio.

P.S. No puedo acceder a ese enlace porque mi firewall lo bloquea como relacionado con los juegos, pero a Google cache of it es suficiente para demostrar que su autor sabe más sobre él que yo.

Cuestiones relacionadas