setlayout definicion create java performance go benchmarking

definicion - ¿Por qué Go es tan lento(en comparación con Java)?



setlayout jpanel (9)

Como podemos ver en The Computer Language Benchmarks Game :

  • Go es en promedio 10 veces más lento que C
  • Go es 3 veces más lento que Java !

¿Cómo puede ser esto, teniendo en cuenta que el compilador Go produce código nativo para la ejecución?
Compiladores inmaduros para Go? ¿O hay algún problema intrínseco con el lenguaje Go?

EDITAR:
La mayoría de las respuestas niegan la lentitud intrínseca de Go languge, alegando que el problema reside en los compiladores inmaduros.
Por lo tanto, he realizado algunas pruebas propias para calcular los números de Fibonacci : el algoritmo iterativo se ejecuta en Go (freebsd, 6g) con la same velocidad que en C (con la opción O3). El aburrido recursivo se ejecuta en Go 2 times más lento que en C (con la opción -O3, con -O0 - el mismo). Pero no he visto caer 10 veces como en el juego Benchmarks.


A pesar de la eficiencia no tan buena de Go sobre el uso de ciclos de CPU, el modelo de concurrencia Go es mucho más rápido que el modelo de subprocesos en Java, por ejemplo, y puede ser comparable al modelo de subprocesamiento de C ++.

Tenga en cuenta que en el benchmark de anillo de rosca , Go fue 16 veces más rápido que Java. En el mismo escenario, Go CSP era casi comparable a C ++, pero usaba 4 veces menos memoria.

El gran poder del lenguaje Go es su modelo de concurrencia, Comunicación de procesos secuenciales, CSP, especificado por Tony Hoare en los años 70, que es simple de implementar y se ajusta a las necesidades altamente concurrentes.


Creo que un hecho que a menudo se pasa por alto es que la compilación de JIT puede ser una compilación estática especialmente para las funciones o métodos de límite de tiempo (en tiempo de ejecución). El punto de acceso JIT decide en RUNTIME qué métodos aplicar en línea, incluso podría ajustar el diseño de datos al tamaño / arquitectura de la CPU en la que se está ejecutando actualmente. C / C ++ en general puede compensar (y en general aún funcionará mejor) al tener acceso directo al hardware. Para Go las cosas pueden parecer diferentes ya que es más de alto nivel en comparación con C, pero actualmente carece de un compilador / sistema de optimización en tiempo de ejecución. Mi intuición me dice que Go podría ser más rápido que Java, ya que Go no aplica puntero persiguiendo tanto y fomenta una mejor estructura de datos localidad + requiere menos asignación.


En el caso de un par de puntos de referencia, es fácil señalar las diferencias específicas de tiempo de ejecución o biblioteca que causan la desaceleración.

El benchmark de árboles binarios se describe como " una adaptación de un punto de referencia para probar GC ". El GC de Go no se encuentra actualmente donde están los Java''s o los C''s, y en cargas de trabajo con toneladas de objetos que contienen punteros y mucha presión de memoria. Si esto fuera un problema en una aplicación Live Go, implementaría su propio grupo de objetos / lista gratuita para reutilizar objetos de este tipo [edit: la gente de CloudFlare, que usa Go, publicó una publicación sobre cómo hacer esto ] Ese es un enfoque para controlar los costos de GC utilizados en los lenguajes de GC en general, pero como la página vinculada señala que está excluida por las reglas de este punto de referencia.

El punto de referencia de pidigits utiliza la biblioteca de números grandes de Math de Go, que es más lenta que las cosas como GMP de C o probablemente las bibliotecas de Java. Si el rendimiento de su aplicación está limitado por la velocidad de bignum (puede ser un factor en la clave pública de cifrado y algunas aplicaciones matemáticas / de ciencia ficción, menos de una en, por ejemplo, servidores de aplicaciones web), querrá llamar a la biblioteca C desde Ve o simplemente usa un idioma diferente.

Muchas otras diferencias probablemente se reduzcan a una generación de código menos optimizada, como dice la respuesta aceptada.

Desea tomar sus decisiones con una perspectiva más amplia que solo los puntos de referencia, por supuesto. Muchos usuarios de Go, incluido yo, parecen provenir de trabajar con lenguajes de scripting , y parecen adorar la inferencia de tipos, las herramientas de concurrencia y la compilación rápida. Por otro lado, la relativa inmadurez del ecosistema (en comparación con Java, los lenguajes C, o incluso Python) es un gran inconveniente, probablemente más grande que los números de referencia. Parece que vale la pena entrar si tiene interés, en cualquier caso.


En la próxima versión de las preguntas frecuentes de Go , debería aparecer algo similar a lo siguiente.

Actuación

¿Por qué Go funciona mal en el benchmark X?

Uno de los objetivos de diseño de Go es acercarse al rendimiento de C para programas comparables, pero en algunos puntos de referencia lo hace bastante mal, incluidos varios en pruebas / banco. Los más lentos dependen de las bibliotecas cuyas versiones de rendimiento comparable no están disponibles en Go. Por ejemplo, pidigits depende de un paquete matemático de precisión múltiple, y las versiones C, a diferencia de Go, usan GMP (que está escrito en un ensamblador optimizado). Los benchmarks que dependen de expresiones regulares (regex-dna, por ejemplo) esencialmente comparan el paquete regexp stopgap de Go con bibliotecas de expresiones regulares maduras y altamente optimizadas como PCRE.

Los juegos de referencia se obtienen mediante una amplia sintonía y las versiones Go de la mayoría de los puntos de referencia necesitan atención. Si mides programas comparables de C y Go (el complemento inverso es un ejemplo), verás que los dos idiomas están mucho más cerca en el rendimiento bruto de lo que indicaría esta suite.

Aún así, hay margen de mejora. Los compiladores son buenos pero podrían ser mejores, muchas bibliotecas necesitan un gran rendimiento y el recolector de basura aún no es lo suficientemente rápido (incluso si lo fuera, tener cuidado de no generar basura innecesaria puede tener un efecto enorme).

Y aquí hay más detalles sobre The Computer Benchmarks Game de un hilo reciente de la lista de correo.

Recolección de basura y rendimiento en gccgo (1)

Recolección de basura y rendimiento en gccgo (2)

Es importante tener en cuenta que Computer Benchmarks Game es solo un juego. Las personas con experiencia en la medición del rendimiento y la planificación de la capacidad coinciden cuidadosamente con las cargas de trabajo similares y realistas; ellos no juegan juegos.


Las cosas han cambiado.

Creo que la respuesta correcta actual a su pregunta es refutar la noción de que ir es lento. En el momento de su consulta su juicio estaba justificado, pero desde entonces ganó mucho terreno en términos de rendimiento. Ahora, todavía no es tan rápido como C, pero no está cerca de ser 10 veces más lento, en un sentido general.

Juego de puntos de referencia del lenguaje informático

En el momento de escribir esto:

source secs KB gz cpu cpu load reverse-complement 1.167x Go 0.49 88,320 1278 0.84 30% 28% 98% 34% C gcc 0.42 145,900 812 0.57 0% 26% 20% 100% pidigits 1.21x Go 2.10 8,084 603 2.10 0% 100% 1% 1% C gcc 1.73 1,992 448 1.73 1% 100% 1% 0% fasta 1.45x Go 1.97 3,456 1344 5.76 76% 71% 74% 73% C gcc 1.36 2,800 1993 5.26 96% 97% 100% 97% regex-dna 1.64x Go 3.89 369,380 1229 8.29 43% 53% 61% 82% C gcc 2.43 339,000 2579 5.68 46% 70% 51% 72% fannkuch-redux 1.72x Go 15.59 952 900 62.08 100% 100% 100% 100% C gcc 9.07 1,576 910 35.43 100% 99% 98% 94% spectral-norm 2x Go 3.96 2,412 548 15.73 99% 99% 100% 99% C gcc 1.98 1,776 1139 7.87 99% 99% 100% 99% n-body 2.27x Go 21.73 952 1310 21.73 0% 100% 1% 2% C gcc 9.56 1,000 1490 9.56 1% 100% 1% 1% k-nucleotide 2.40x Go 15.48 149,276 1582 54.68 88% 97% 90% 79% C gcc 6.46 130,076 1500 17.06 51% 37% 89% 88% mandelbrot 3.19x Go 5.68 30,756 894 22.56 100% 100% 99% 99% C gcc 1.78 29,792 911 7.03 100% 99% 99% 98%

Sin embargo, sufre brutalmente en el benchmark de árbol binario:

binary-trees 12.16x Go 39.88 361,208 688 152.12 96% 95% 96% 96% C gcc 3.28 156,780 906 10.12 91% 77% 59% 83%


Los compiladores 6g y 8g no son particularmente optimizadores, por lo que el código que producen no es particularmente rápido.

Están diseñados para correr rápido y producir código que está bien (hay un poco de optimización). gccgo utiliza las pasadas de optimización existentes de GCC, y podría proporcionar una comparación más significativa con C, pero gccgo aún no es completo.

Las cifras de referencia se basan casi por completo en la calidad de la implementación. No tienen una gran cantidad que ver con el lenguaje como tal, excepto en la medida en que la implementación emplea tiempo de ejecución para soportar características de lenguaje que el índice de referencia realmente no necesita. En la mayoría de los lenguajes compilados, un compilador suficientemente inteligente podría, en teoría, eliminar lo que no se necesita, pero llega un punto en el que se manipula la demostración, ya que muy pocos usuarios reales del lenguaje escriben programas que no usan esa característica . Desplazar las cosas sin quitarlas del todo (por ejemplo, predecir destinos de llamadas virtuales en Java compilado por JIT) comienza a ser complicado.

FWIW, mi propia prueba muy trivial con Go cuando la estaba viendo (un bucle de suma entera, básicamente), gccgo producía código hacia el extremo rápido del rango entre gcc -O0 y gcc -O2 para el equivalente C. Ir no es intrínsecamente lento, pero los compiladores aún no hacen todo. No es sorprendente para un idioma que tiene 10 minutos de antigüedad.


Mi respuesta no es tan técnica como la de todos los demás, pero creo que sigue siendo relevante. Vi los mismos puntos de referencia en Computer Benchmarks Game cuando decidí empezar a aprender Go. Pero, sinceramente, creo que todos estos puntos de referencia sintéticos son inútiles en términos de decidir si Go es lo suficientemente rápido para ti.

Había escrito un servidor de mensajes en Python usando Tornado + TornadIO + ZMQ recientemente, y para mi primer proyecto Go decidí reescribir el servidor en Go. Hasta ahora, habiendo conseguido que el servidor tenga la misma funcionalidad que la versión de Python, mis pruebas me muestran un aumento de la velocidad 4.7x en el programa Go. Eso sí, solo he estado programando Go por quizás una semana, y he estado codificando en Python durante más de 5 años.

Go solo se volverá más rápido a medida que continúen trabajando en él, y creo que en realidad se trata de cómo funciona en una aplicación del mundo real y no en pequeños puntos de referencia computacionales. Para mí, Go aparentemente resultó en un programa más eficiente que lo que podía producir en Python. Esa es mi opinión sobre la respuesta a esta pregunta.


Tanto Java como C son más explícitos con sus definiciones de datos y método (función). C está estáticamente estátizado, y Java lo es menos con su modelo de herencia. Esto significa que la forma en que se manejarán los datos está prácticamente definida durante la compilación.

Go está más implícito con sus definiciones de datos y funciones. Las funciones integradas son de naturaleza más general, y la falta de una jerarquía de tipos (como Java o C ++) le da a Go una desventaja de velocidad.

Tenga en cuenta que el objetivo de Google para el lenguaje Go es tener un compromiso aceptable entre la velocidad de ejecución y la velocidad de codificación. Creo que están alcanzando un buen punto en su primer intento, y las cosas solo mejorarán a medida que se haga más trabajo.

Si compara Go con más idiomas de tipado dinámico cuya principal ventaja es la velocidad de codificación, verá la ventaja de la velocidad de ejecución de Go. Go es 8 veces más rápido que Perl, y 6 veces más rápido que Ruby 1.9 y Python 3 en esos benchmarks que utilizó.

De todos modos, la mejor pregunta es: ¿es un buen compromiso en cuanto a la facilidad de programación frente a la velocidad de ejecución? Mi respuesta es sí y debería mejorar.


Todo se reduce a cuánto tiempo lleva codificar algo y qué tan poco trabajo se necesita para obtener el mejor rendimiento de lo que sea que se desarrolle. Todo lo demás es solo una búsqueda nerd que no tiene mucha relevancia en los negocios ....... ese tipo de cosas.

Go hace que el desarrollo de excelentes servicios sea más fácil de apoyar. Java ... independientemente de su capacidad técnica ... pesadilla para soportar ...

Escribí algunos programas de Golang ... tan rápido como una mierda por un ganso ... y si mi tarea era resolver las matemáticas serias todo el día ... no creo que use Java o Go para eso. Utilizaría un lenguaje diseñado para ese tipo de cosas.