questions interview español java core

español - java core interview questions



¿Math.max(a, b) o(a> b)? A: b es más rápido en Java? (8)

¿Cuál es más rápido en Java y por qué?

  1. Math.max(a,b)
  2. (a>b)?a:b

(Esto fue preguntado en una entrevista.)


He estado en el extremo receptor de este tipo de pregunta y generalmente tienen más que ver con la forma en que respondes a la pregunta que con la respuesta "correcta".


La pregunta original no especifica el tipo de los argumentos. Esto importa porque la definición de max (y min) para los argumentos de punto flotante es más compleja. Para el punto flotante (doble o flotante) es probable que el método Math.max sea más lento, pero también puede devolver un resultado diferente si uno de los argumentos es NaN.


Las preguntas de rendimiento siempre requieren una prueba antes de que pueda comenzar a especular:

public static void maxtest() { int res = 0; for( int idx = 0; --idx != 0; ) // res = ( res > idx ) ? res : idx; res = Math.max( res, idx ); System.out.println( "res: " + res ); }

Esto se ejecuta en mi máquina 6 segundos con Math.max() y 3.2 segundos con ?: En el último servidor 1.6.1 x64 Sun JVM. Entonces ?: Es en realidad más rápido. Contrariamente a todas las esperanzas que nos gusta poner en los JIT que realmente se han vuelto increíbles para cuando todavía no lo atrapan todo.

EDITAR: Por curiosidad, también probé este código con el cliente de 32 bits JVM 1.6.1 en la misma máquina y con esto, ambas versiones se ejecutan en 7 segundos. Por lo tanto, es probable que no sea la invocación del método la que no se integre, pero el JIT del servidor parece ser capaz de realizar algunas optimizaciones adicionales para este caso de prueba en particular que no puede detectar cuando hay una llamada al método involucrada.


No confíe en la especulación . En su lugar, haga una prueba comparativa de su caso de uso particular.

Algunos detalles fácilmente pasados ​​por alto en muchas de las otras respuestas:

Si bien puede ver una fuente Java de Math.max , esto no es realmente lo que se utilizará. Este método tiene una versión intrínseca en casi todos los JRE. Consulte el código fuente de Hotspot en JDK7, vmSymbols.hpp para obtener una lista de tales intrínsecos.

Por lo que puedo decir, Hotspot intentará una serie de optimizaciones cuando vea una declaración max o min ; en particular para optimizar, por ejemplo, arraycopy . Entre otros, realmente optimizará Math.max(same, same) distancia.

En otros casos, sin embargo, puede que no se optimice mucho; (a<=b)?a:b puede ser más rápido. He estado comparando un poco, y de hecho a menudo encontré que esto es más rápido. Pero YMMV, y definitivamente depende del contexto si Hotspot puede optimizar uno u otro mejor. También variará de la versión de punto de acceso a la versión de punto de acceso ...


No es el mísmo. ¿Cuándo estás escribiendo (a > b) ? a : b (a > b) ? a : b no tiene una llamada de función adicional, por lo que será más rápido. Es el equivalente de alinear en C ++. Pero esto no hará ninguna diferencia en la vida real. Math.max(a,b) es más legible, así que lo usaría.


Si hubiera hecho una pregunta de este tipo en una entrevista, habría esperado que el candidato me dijera que las dos expresiones pueden no dar el mismo resultado para todos los tipos posibles de a y b.


Here está el código de Math.max() para Math.max() en Java:

public static int max(int a, int b) { return (a >= b) ? a : b; }

Por lo tanto, el código probablemente sería (casi) exactamente la misma velocidad.

(Seamos honestos, si está preocupado por las mejoras de velocidad en un nivel tan bajo, probablemente tenga problemas mucho mayores en su código).


Math.max(a, b) es una función estática (es decir, sin sobrecarga de llamadas virtuales) y es probable que la JVM lo incorpore a las mismas instrucciones que (a > b) ? a : b (a > b) ? a : b .