EDICIóN GENERAL
250 meneos
7309 clics
¿Por qué es 2 * (i * i) más rápido que 2 * i * i en Java? (Eng)

¿Por qué es 2 * (i * i) más rápido que 2 * i * i en Java? (Eng)

Si reemplazo 2 * (i * i) por 2 * i * i, se tarda entre 0.60 y 0.65s en ejecutarse. ¿Cómo es posible?

| etiquetas: programación , java , rápido
«12
  1. #2 #5 #3 #4 La diferencia en tiempo de ejecucuion puede ser de 0,10 segundos ahora bien en un proceso iterativo que recorra mierda esos 0,1 segundos igual son 45 minutos de proceso en vacio del cpd y ahi si que se empieza a notar la cosa.

    No subestimeis las bajadas de rendimiento para estas movidas, para una app para usuario normal claro que te la pela, para procesos que corren en backend en job con miles de operaciones igual no.

    #1 Y usted, haga el favor de reciclarse en un lenguaje ya y dejar de insultarlos todos xD
  2. #2 ya es hora de que la sociedad despierte y coja el toro por lo cuernos. A los niños no se les puede seguir contando historias edulcoradas de cigüeñas que vienen de París. No podemos seguir haciendo como si aquí no pasase nada mientras 2*i*i tarda más que 2*(i*i) y miramos hipócritamente hacia otro lado mientras egoistamente nos dedicamos a lo nuestro sin preocuparnos por el vecino.
  3. #12 i.redd.it/3w74rvpac2911.jpg
    Nada mas que añadir.
  4. porque java apesta

    #killJava
  5. #4 Despues nos quejamos de los recursos que requieren ciertos juegos y que a pesar de tener un pepino de maquina aun hay lag. Seran 0.1 seg aqui, pero solo en esta linea de codigo, ahora piensa en una aplicacion con 100.000 lineas de codigo.
  6. #4 No es una diferencia de 0,05 segundos, es una diferencia del 8% del tiempo.

    Si esa operación se ejecuta 1.000 veces a lo largo de un programa, es una diferencia considerable.
  7. #4 Bueno, si la operación está en un bucle o una consulta tocha, se va acumulando esa mejora. Y eso sí es de buen programador. Si los nuevos programadores optimizasen como los del principio, igual no habría que estar multiplicando la potencia de las máquinas cada 2 años.
  8. Viene al caso  media
  9. #52 Carmack podría haber usado 1/sqrt() clásico. los ordenadores x86 tiene una instrucción dedicada para la raiz cuadrada, pero es mucho más lenta que un desplazamiento binario, una resta y un par de multiplicaciones. Aunque es una aproximación, con ello ganaban rendimiento. El hecho de que la ñapa se haga con ese código o con otro por temas de patentes no es el punto de mi comentario. A lo que iba es que ganando rendimiento en una sola función que se usa millones de veces puede tener un incremento de rendimiento bestial en la aplicación final
  10. #4 en.wikipedia.org/wiki/Fast_inverse_square_root

    float Q_rsqrt( float number )
    {
     long i;
     float x2, y;
     const float threehalfs = 1.5F;

     x2 = number * 0.5F;
     y = number;
     i = * ( long * ) &y; // evil floating point bit level hacking
    i = 0x5f3759df - ( i >> 1 ); // what the fuck?
     y = * ( float * ) &i;
     y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
    // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed

     return y;
    }

    Esa ñapa permitió que quake 3 funcionara en los pcs de la época. No subestimes el incremento de rendimiento que te da acelerar una simple función
  11. He cambiado 2 * i * i por 2* (i*i) en mi aplicación y ahora consume un 20% menos de CPU, un 25% de memoria y sin más, acaba de ganar a Alpha 0 al ajedrez mientras conducía un Tesla camino a Venus.

    #lo_del_i*i
  12. #14 Tiene cojones que se queje la reinona de java y esté mirando javascript xD
  13. #3 Totalmente en desacuerdo. Aquí el mal programador sería en tal caso el que hizo el compilador, ya que no existe ninguna justificación lógica para que 2 * (i * i) genere distinto bytecode que 2 * i * i.
  14. Me encanta como todos los comentarios intentan encontrarle una razón y todos se equivocan porque no se han leído la respuesta de stackoverflow.
    Desde luego da la sensación que la mayoría aquí para solucionar sus problemas entra en stackoverflow, copian y pegan la solución y a ver si funciona, total para qué leer primero de qué va la solución.
  15. #11 Corrigiendo mi comentario y el tuyo, la diferencia la mide al correr un programa que hace la operación mil millones de veces. Vamos, que para cada iteración viene siendo bastante desdeñable. Eso no quita, como dice #13, que sea una diferencia en un programa muy sencillo, y que en temas complicados sí sea apreciable.
  16. #32 wordpress tiene mas agujeros de seguridad que un queso gruyere.
    Para ERPS Java->todo.
    PHP esta muy bien para empresas medianas y pequeñas,pero las grandes van a Java,ya que les da igual las pelas que cuesten los servidores,se ahorran mucho con lo fácil que es implementar el proyecto en Java.
  17. #15 Falta la version en ASM, donde cambia una A por una B y acaba matando a la princesa y follandose al dragon.
  18. #46 Qué lenguaje no lo es?
    Se me ocurren motivos por lo que casi todos los lenguajes más usados son una puta mierda.
    También se me ocurren motivos por los que casi todos son estupendos.

    P.D: No me gusta java, pero decir que es una puta mierda es una gilipollez.
  19. #3 Teniendo en cuenta que es un fallo de la máquina virtual, más que dedicar tiempo a optimizar esto lo eficiente es reportarlo, y esperar a la siguiente versión de la máquina virtual que arregle el problema.
  20. #65 buena pelicula
  21. #1 antes me caías bien,pero veo que eres un tio con un gusto cuestionable.
  22. #47 no se que medidas tomas tu, pero 0,10 no es un miliseguno, es 1/10 segundos o lo que es lo mismo 100 milisegundos. En juego a 30 frames/segundo (33ms cada frame) estamos hablando de 3 frames que pierdes en mover la fresita.
  23. Siempre me lo habría preguntado pero nunca me atreví a hacerlo. Gracias.

    Si esto no llega a portada yo ya no sé que va a llegar.
  24. #37 Como Facebook, la wikipedia, yahoo.... no sé, cosas de empresas pequeñas y medianas.
  25. #7 PHP y JavaScript te envían un abrazo.
  26. #20 He cambiado 2 * i * i por 2* (i*i) en mi aplicación y ahora mis relaciones con las mujeres son mucho más fructiferas, mi cabello tiene más fuerza y volumen y resucitó a mi gatito. Nunca podré agradecer del todo esta mejora.
  27. #75 Creo que le debes un poco de respeto a la coprofagia acondroplasica germana, un género lleno de matices y sutilezas que no se merece tal desprecio
  28. Me encanta el olor a Meneame ClassicTM por la mañana. :-)
  29. #12 Los mayores no usamos juguetes.
  30. #15 No soy informatico y de lenguajes se mas bien poco. Pero, y lo que me he reido :->
  31. Muy bueno. El tener conocimiento de estas cosas, y ahorrar varios segundos de ejecución en un programa, diferencia de un programador de un buen programador.
  32. #51 No permitió que funcionase, permitió liberar el código sin problemas legales, porque el algoritmo "clásico" tenía una patente en vigor.

    Lo cual demuestra que John Carmack es el puto amo, básicamente.
  33. #32 Que sepas que configurar un CMS y tocar un poco las plantillas no se puede llamar desarrollo web.
  34. #126 No, no falta. Monty Python sale perfectamente referenciado en la primera viñeta de PHP :troll:

    cc/ #15  media
  35. Basicamente porque multiplicar por 2 es extremadamente fácil y cuanto más grande sea el número a multiplicar por 2 más tiempo ahorrará.
    Supongamos que multiplicar x2 es un 10% más rápido que multiplicar por cualquier otro número.
    La multiplicación tiene un coste (hay bastantes mov, push cambios de registro etc...)
    Si yo multiplico 2x500x500 primero hago 2x500=1000 y luego 1000*500 Nos queda que el numéro más grande no se ultiplica por dos
    En cambio si yo multiplico (500x500) tengo 250000 y luego lo multiplico por 2 por lo que la operación más costosa la hago con el multiplicador más fácil para la máquina.
  36. #29 cariño me sumo a las modas, y la moda ahora es odiar Java. Pues no se hable más, odio Java.

    jajaajaj
  37. #24 Lo se pero amos quejarse de java desde otro lenguaje de tipado debil xD
  38. ¿Porque Java es una puta mierda de lenguaje?
  39. #37 Django ... :-D
  40. #22 hay que revindicarlo más. Eso, o seguir con noticias de VOX
  41. #15 Falta Python:

    from castle import Princess

    Y te sobra una viñeta para escribir un readme y un script de instalación con más líneas que la propia aplicación y subir el paquete a PyPI para que no lo descargue nadie :-D
  42. #40 En C en ambos casos se generan los siguientes opcodes de 80x86 (gcc 8 con -O3 -m64)

    imul edi, edi
    lea eax, [rdi+rdi]


    Punto final.
  43. #15 Yo sí voy a añadir algo (los "=" se ven un poco mal)  media
  44. #17 homeeeeeeeeee, no tiene nada que ver uno con el otro eh!
  45. #4 Depende de lo que programes.

    Yo estoy ahora mismo con aplicaciones donde hay un tiempo de ciclo de 20ms.
    100 milisegundos es una aplicación que no funciona.
  46. #17 me imagino que #14 lo dira porque javascript a palo seco es mas guarro que una peli porno alemana de enanos cagandose en el pecho. Con estas librerias como que se queda el lenguaje un poco mas apañado, aunque siga siendo el hermano feo de frankenstein. xD
  47. #137 calva!
  48. #1 Ya me jodería odiar el lenguaje que se ha convertido en el estándar de la industria....
  49. #5 Sé que no lo has dicho, pero como bien dices entre líneas esto es lo que pasa cuando se permite que un populista llegue a venezuela como presidente. Disfruten lo votado.
  50. #1 mis dieses.
  51. #1 programa en Rails!!!
  52. #62 Pues parece que en Java es un poco mas eficiente el caso de declarar las variables dentro del for
    stackoverflow.com/questions/407255/difference-between-declaring-variab
  53. #15 Lo que tu quieras con PHP pero es uno de los lenguajes mas utilizados para desarrollo web. Los CMS mas populares ya sea wordpress, drupal, joomla o para ecommerce prestashop, magento estan desarrollados en php
  54. #4 0,10 segundos en un algoritmo iterativo complejo con muchos cálculos, se pueden convertir en algunos segundos ;).

    0,10 segundos en un calculo en tiempo real necesario en un videojuego es ralentización segura.
  55. #71 facebook usa una extensión de Php llamada hack.
    De yahoo ni idea de donde lo has leido,es dificil encontrar información de algo que esta muerto.
  56. #98 hay muchísimas en gittheprincess,esta me marco en la uni,es una versión algo mas antigua.
  57. #49 Java es lento, lento como el solo. Y que tengas que declarar una clase para hacer un puto hola mundo lo convierte automáticamente en basura
  58. #109 Java es mucho más rápido que los siguientes lenguajes:

    - Ruby
    - PHP
    - Python
    - Javascript.

    Cuatro lenguajes que son muy, muy, muy usados.
    Entiendo que esos cuatro lenguajes son basura también no?
  59. #1 Aplaudo su detallada argumentación
  60. #3 me dedico a esta industria hace mucho tiempo, y este tipo de cosas no solo no diferencia a un buen programador de un mal programador, sino que suele ser al revés.

    Los buenos programadores saben que lo más importante es estructurar el programa de forma correcta, y que como consecuencia de una buena estructura, se obtiene mayor rendimiento, escalabilidad y seguridad, simplemente por qué un programa estructurado correctamente, cambiar cosas es muy fácil, y donde ponia 2*I*I mañana pone otra cosa, sin casi ningun coste.

    Mientras tanto, el programador Junior hace programas de mierda, que no se pueden mantener ni extender según se necesite, pero habitualmente habla del rendimiento y de este tipo de trucos específicos de la plataforma.... Como si ese tipo de cosas, fuesen a cambiar el hecho de que mantener y extender su programa es un infierno, y que cuando aparezcan nuevos truquitos de la plataforma, el no podrá aplicarlos fácilmente a su programa, mientras que los programadores expertos con programas mantenibles y extensibles si podrán.
  61. #3 Hombre, este ejemplo quizás sea un poco excesivo, pero sí que ves mala praxis a diario. Gente que declara variables dentro de bucles que se ejecutan miles de veces :ffu: o que concatenan cadenas enormes con el operador +=
  62. #37 Discrepo
  63. #132 xD Y el horse typing.

    - Si camina como un caballo, galopa como un caballo y suena como un caballo. ¿Qué es?
    - Unos cocos.
  64. #25 Java es para dummies,conviértete,ven al lado oscuro.
  65. #95 Que la cámara la mueva la GPU no quiere decir que la CPU no haga nada, por ejemplo, calcula colisiones, físicas, IA, lógica en cada draw call. Sino los juegos de ahora, no estarían pidiendo monstruos de 4 nucleos a frecuencias altas.

    Yo no estoy discutiendo que este ejemplo se vaya a dar en el mundo real o merezca la pena esa optimización (sinceramente casi nadie programa juegos en Java ya, quitando Android, pero incluso en Android me suena que existe otra api alternativa). Lo que estoy diciendo es que aunque 100ms puedan parecer poco tiempo, es mucho en algunos ámbitos como pueden ser los juegos.
  66. #93 No se, creo que te estás liando un poco.
    Lo que aquí se está exponiendo es la ligera mejora de rendimiento que supone factorizar la multiplicación del ejemplo propuesto dentro de un bucle en Java. Lo cual se debe probablemente a una mayor optimización del bytecode por parte del JIT al hacer el desenroscado del bucle (loop unrolling) en el primer caso, quizá por tener un stack separado como resultado de dicha factorización y no tener que hacer tantas llamadas a stack para conservar los resultados intermedios que generaría 2 * i * i
  67. #97 De hecho, a mi juicio, esto sólo es importante para los que hacen compiladores...
  68. #15 demasiado subjetivo xD. Está hecho por alguien que ama Java, se ve.
  69. #6 o metido en un loop.
  70. Lo gracioso, o no tanto, es como el programa simplemente compilado en C puede ir 5 veces más rapido, y sin tener que cargar una maquina virtual ni implementar un jit.
  71. #20 y que tal iria esta? > ||*|| mas rápido no se, pero igual tu aplicación se independiza en cuanto no te des cuenta xD
  72. #96 el problema no es que un juego pida mucha máquina (que también) El verdadero problema es que una web con 3 divs y dos .js te piden 8 núcleos xD
  73. #30 El problema no viene por ahi. Estoy convencido que estoy pasa tambien si en vez de multiplicar por dos multiplicadas por tres. Internamente, la JVM esta pensada como una maquina de pila, no de registros. Cuando conviertes ese código a código nativo, acabas generando código que utiliza una cantidad muy pequeña de registros.

    Muy por encima (en pseudoensamblador), imagino que la opción rápida hace:
    MOV RAX [i]
    MUL RAX, RAX, RAX
    MUL RAX, RAX, 2

    Mientras que la opción lenta hace:
    MOV RAX, [i]
    MUL RAX, RAX, 2
    MOV RBX, [i]
    MUL RAX, RAX, RBX

    En el primer caso, se esta haciendo una única llamada a [i] (traer el valor de i desde memoria), mientras que en el segundo, se trae el valor de [i] dos veces. Incluso si en el segundo fragmento juegas un poco con el orden:
    MOV RBX [i]
    MUL RAX, RBX, 2
    MUL RAX, RAX, RBX

    Aunque ahora solo usas una llamada a [i], sigues utilizando dos registros. Lo que significa que tienes que guardar el contenido de dichos registros antes en la pila, lo cual también te lleva tiempo.

    No me he puesto a mirar en serio la verdad, pero por lo que me conozco de la JVM (basicamente mi trabajo), apostaria dinero a que viene por ahi
  74. #111 Quien ha dicho eso, he dicho que los principales CMS están desarrollados en PHP esto conlleva todo una comunidad de desarrolladores que crean modulos, plugins adicionales para estas plataformas.
  75. #2 tortilla de patatas con grafeno y cebolla dentro de un opel corsa,eso no fallaría nunca.
  76. #4 quizás esta de mantenimiento,entonces tiene tiempo de sobra para hacer eso,si se descuenta algo de tiempo de su hora de café(8 horas al día)
  77. #82 Eso está muy bien, un primer paso es reconocerlo, pero no debería quedarse ahí y deberías buscar ayuda.
  78. #86 "JacaScript.net" ...

    Si esto no es motivo de strike por incitacion al odio, yo ya no entiendo esta web

    xD
  79. #123 No se porque pero me ha recordado a Mars Attack!!!
  80. #116 argumenta por favor.
  81. #4 Todo depende de qué estés progamando, y de cuantas veces realices operaciones similares. :-D
  82. #15: Deberían parodiar a Phyton también, que tiene mucho que pwnear, por ejemplo, que la estructura va en la indentación, ideal para copiar y pegar en según que entornos, además de que es más fácil liarse si tienes que añadir cosas anidadas.
  83. #44 0.10 en mil millones de iteraciones.
    Vamos, lo que viene siendo una diferencia al mover una fresita en un juego de mover frutas de quizá un milisegundo.
    Optimiza ahora todos los i*i para pasarlos a (i*i) para ahorrar ese milisegundo...
  84. #55 Cuando multiplicas por 2 solo haces 1 mov ;)

    1 --> 1 * 2 --> 10
    2 --> 10 *2 --> 100
    3--> 11 * 2 --> 110
    4-->100 *2 --> 1000
  85. #50 el milisegundo me lo he sacado de la manga. La diferencia de 0.10 segundos se da en 1000 millones de iteraciones. Si tú mueves la fresita cambiando la "x" y la "y" en una cuadrícula 2D de píxeles, y la calculas en un bucle que tenga en cuenta todos los píxeles de la imagen a mover, tendrás unos pocos cientos (miles como mucho) de iteraciones. Por tanto la diferencia será prácticamente despreciable y por eso me saco de la manga el milisegundo en una app. En realidad el movimiento de X e Y lo tendrás parametrizado de algún modo, así que ni tendrás que iterar sobre la matriz de píxeles.

    Si tú estás trabajando en un juego en HD para video consola ese desfase quizá, sólo quizá, fuera apreciable en casos muy extremos... pero dudo mucho que lo fuera. Francamente lo dudo... además, nunca hemos visto en videojuegos cosas como que haya monigotes que atraviesen paredes o se queden "atorados" en bordes geométricos...

    Y si estás trabajando en determinados proyectos muy, muy concretos que exijan un enorme número de operaciones matemáticas en tiempo real (francamente, no se me ocurre ninguno...) pues tal vez se note.
  86. #58 #55 Y si no recuerdo mal la instrucción era shl o algo así, la que no rota (hace muchos años ya que hice ensamblador en ingeniería informática).
  87. #52 No lo escribió él. Pero me parece muy elegante la solución.
  88. Nadie dice nada del PUTO AMO que da la respuesta en stackoverflow ?
  89. Porque el compilador de Java es un truño.
    Siguiente pregunta.
  90. #113 El único lenguaje que no es basura es C. Bueno, y Fortran
  91. #74 Correcto. Algo parecido digo en #60.
    Pero no implica que en la grandísima mayoría de ocasiones la diferencia es despreciable.

    Más aún, si tienes que analizar todos los problemas del compilador (probablemente esto es un problema del compilador ya que no hay ninguna razón lógica para ello) para casi cualquier operación del programa nunca acabarías el programa.

    Premature optimization is the root of all evil.
  92. #134 Si tanto te importa la diferencia entre i*i respecto a (i*i) entiendo que tú sólo programas en ensamblador aplicaciones de altísimo rendimiento en tiempo real y en la vida te acercas a malignas cosas tales como lenguajes de alto nivel que usen un compilador (o VM) o, herejía, lenguajes interpretados.

    Sin acritud.
  93. #80 La lógica, en tu ejemplo, es, a mi juicio, mucho menos problemática que no declarar los enteros como constantes con un nombre descriptivo para saber a qué se refieren.... :-P
  94. #112 En ese ejemplo no creo que sea por tema de eficiencia, sino por ámbito de variable...
«12
comentarios cerrados

menéame