Mejor Rendimiento en Java

Publicado en 'Programación' por bichoflyer, 30 Jun 2014.





  1. bichoflyer

    bichoflyer Miembro nuevo

    Registro:
    13 May 2012
    Mensajes:
    33
    Likes:
    8




    Hola estimados,
    Una consulta que quisiera resolver, ¿cuál de estos dos códigos rinde mejor cuando hablamos de números grandes y gran cantidad de datos?:
    Código:
    if(x>=0)
    o
    Código:
    if(x>-1)
    Yo supongo que el >= realiza 2 operaciones lógicas, mientras que el > sólo 1. Alguien me dijo que el x>-1 también realiza una operación aritmética por el "-"; pero yo creo que como el signo está almacenado en memoria no debería efectuarse nada más que la operación lógica.
    ¿Qué opinan ustedes?
    Gracias,
    :hi:
     


  2. gnox

    gnox Miembro maestro

    Registro:
    3 Ene 2013
    Mensajes:
    793
    Likes:
    252
    Depende del tipo de dato de X y la implementación del jvm que lee el bytecode implementado en el OS donde lo estas ejecutando, usa un java bytecode profiler si quieres saber realmente la performance.

    a opinión personal realmente deberías escribir código que puedas entender a posteriori, el tipo de dato de X debería ser comparado con lógica que va de acuerdo a la función que desempeña cada valor de X dentro de tu programa sin importar el volumen de datos.
     
  3. MPQRS

    MPQRS Miembro frecuente

    Registro:
    28 Jun 2011
    Mensajes:
    219
    Likes:
    21
    estas hablando enserio?, utilízalo como realmente necesites para que vas a igualar a 0 si no es necesario o viceversa, tu estas loco mira esto (x>=0 no es igual x>-1) o (">=" no es igual que ">") como es que intentas compararlos. cumplen roles diferentes.

    si aun no lo entiendes te digo que si lo necesitas lo uses si no para que echar relleno.
     
    Última edición: 7 Jul 2014
  4. drkrap

    drkrap Miembro de bronce

    Registro:
    18 Ene 2011
    Mensajes:
    1,345
    Likes:
    304
    vamos a repasar algo de concepto java:

    java utiliza un motor/compilador llamado jvm o java virtual machine, este jvm es el espacio en donde se ejecuta el programa java, haciendo de interprete entre el equipo host (que puede ser una pc u otro equipo) y tu programa realizado en java, esta es una ventaja y una desventaja al mismo tiempo:
    ventaja: permite la ejecución de programas en java virtualmente en cualquier dispositivo
    desventaja: al necesitar de un interprete(jvm) degrada el performance de la aplicación, separa ram(la separa para que tu aplicación pueda tener memoria en ram suficiente para ejecutarse)

    sobre tu consulta especifica, veamos como piensa la máquina cada uno de los dos códigos:

    Código:
    if(x>=0)
    aqui le dices a la maquina que tomará condición verdadera siempre y cuando el valor de la variable x séa mayor o igual a 0, es decir todos los números reales positivos, para la máquina será mucho más facil darle un valor a la x puesto a que, para definir el "0" en memoria es simplemente una cadena de bits 0000000 y listo, se realiza la comparación.

    el segundo código
    Código:
    if(x>-1)
    aqui le dices a la máquina que tome todos los números mayores que -1, aqui estas tomando el 0 y aparte estas tomando valores como el -0.1,-0.2.....-0.99999999,en cristiano estas tomando tanto positivos como negativos, aqui la cosa se vuelve interesante, puesto que para manejar los negativos el equipo necesita una flag(puntero, bandera ) para definir si un numero es negativo o positivo, es decir para que la máquina interprete tu "-1" guardará en memoria 10000001 donde el primer bit (1) es el bit de cambio del signo, esto aumenta tus registros siempre en 1 bit.

    ahora sobre la comparación en binario tecnicamente es una resta controlada, lo digo controlada puesto a que del resto se sabra si es que el numero es mayor(la resta saldra mayor al numero esperado que es 0) o menor, en la cual no se cumple la condición.

    ahora segun la explicación que te dí, cual de los dos códigos es más eficiente?

    saludos
    :hi::hi::hi:
     
  5. AiApaec

    AiApaec Miembro frecuente

    Registro:
    1 May 2014
    Mensajes:
    58
    Likes:
    14
    Una pregunta: si los compiladores se permiten cambiar tu código por motivos de eficiencia(de tu código) ¿sería posible que en este caso x>-1 se sea convertido por el compilador a x>=0? claro viendo el byte code generado se acabarían las dudas pero por ahora no tengo nada de java en mi máquina :D

    Y para el creador del post, hay que tener en cuenta siempre lo que dijo Donald Knuth: Premature optimization is the root of all evil (or at least most of it).

    Y que nunca se te olvide la regla KISS cuando desarrolles software, te lo agredecerán y te lo agredecerás: Keep it simple s...sir!!
    :hi:
     
    Última edición: 8 Jul 2014
    A drkrap le gustó este mensaje.
  6. drkrap

    drkrap Miembro de bronce

    Registro:
    18 Ene 2011
    Mensajes:
    1,345
    Likes:
    304
    es que igual lo lanzas sobre la jvm,ahora quien tienen que optimizar el codigo es el jvm no tu compilador/IDE, java es diferente a lenguajes como C++ o Power Builder porque no permite realizar una mejora de codigo tan adentro, al punto de llegar a byte code.. lo que optimizas en Java no es el binario como tal, si no optimizas tu código aun en lenguaje comun y correiente, esto me lo dijo un profe que me decia lo siguiente:

    Java es y sera lento tooda su vida, es como un windows en codigo para aplicaciones C/S

    :hi::hi: