ruby - una - view lenta mysql
¿Qué hace que Ruby sea lenta? (9)
Ruby es lento. Pero, ¿qué partes de él son los más problemáticos?
Hace una "búsqueda tardía" de métodos para permitir la flexibilidad. Esto lo ralentiza un poco. También tiene que recordar los nombres de las variables por contexto para permitir la evaluación, por lo que sus marcos y las llamadas a los métodos son más lentos. También carece de un buen compilador JIT actualmente, aunque MRI 1.9 tiene un compilador de bytecode (que es mejor), y jruby lo compila en bytecode java, que luego (puede) compilar a través del compilador JIT de HotSpot JVM, pero termina siendo sobre la misma velocidad que 1.9.
¿Cuánto afecta el rendimiento del recolector de basura? Sé que he tenido momentos en los que ejecutar el recolector de basura solo tomó varios segundos, especialmente cuando se trabaja con bibliotecas OpenGL.
de algunos de los gráficos en http://www.igvita.com/2009/06/13/profiling-ruby-with-googles-perftools/ Yo diría que se necesita un 10%, que es bastante, se puede disminuya ese golpe aumentando el malloc_limit en gc.c y recompilando.
He usado las bibliotecas matemáticas de matriz con Ruby que eran particularmente lentas. ¿Hay algún problema con la forma en que Ruby implementa las matemáticas básicas?
Ruby 1.8 "no implementó" matemática básica, implementó las clases numéricas y llamaría cosas como Fixnum # + Fixnum # / una vez por llamada, lo que fue lento. Ruby 1.9 trucos un poco mediante la incorporación de algunas de las operaciones básicas de matemáticas.
¿Hay alguna característica dinámica en Ruby que simplemente no se pueda implementar de manera eficiente? Si es así, ¿cómo otros idiomas como Lua y Python resuelven estos problemas?
Cosas como eval son difíciles de implementar eficientemente, aunque se puede hacer mucho trabajo, estoy seguro. El truco para Ruby es que tiene que acomodarse para que alguien en otro hilo cambie la definición de una clase espontáneamente, por lo que tiene que ser muy conservador.
¿Ha habido trabajos recientes que hayan mejorado significativamente el rendimiento?
1.9 es como una aceleración 2x. También es más eficiente en el espacio. JRuby intenta constantemente mejorar la velocidad [y probablemente gasta menos tiempo en el GC que KRI]. Además de eso, no estoy al tanto de muchas cosas de hobby en las que he estado trabajando. Tenga en cuenta también que las cadenas 1.9 son a veces más lentas debido a la facilidad de codificación.
Ruby es lento en ciertas cosas. Pero, ¿qué partes de él son los más problemáticos?
¿Cuánto afecta el recolector de basura al rendimiento? Sé que he tenido momentos en los que ejecutar el recolector de basura solo tomó varios segundos, especialmente cuando se trabaja con bibliotecas OpenGL.
He usado las bibliotecas matemáticas de matriz con Ruby que eran particularmente lentas. ¿Hay algún problema con la forma en que Ruby implementa las matemáticas básicas?
¿Hay alguna característica dinámica en Ruby que simplemente no se pueda implementar de manera eficiente? Si es así, ¿cómo otros idiomas como Lua y Python resuelven estos problemas?
¿Ha habido trabajos recientes que hayan mejorado significativamente el rendimiento?
Hmm - Hace unos años trabajé en un proyecto en el que trabajé en el barril con el rendimiento de Ruby, y no estoy seguro de que haya cambiado mucho desde entonces. En este momento es una advertencia: debes saber que no debes hacer ciertas cosas, y francamente juegos / aplicaciones en tiempo real serían una de ellas (ya que mencionas OpenGL).
El culpable de matar el rendimiento interactivo es el recolector de basura. Otros mencionan que Java y otros entornos también tienen recolección de basura, pero Ruby tiene que detener la ejecución del mundo . Es decir, tiene que dejar de ejecutar su programa, escanear desde cero todos los registros y punteros de memoria, marcar la memoria que todavía está en uso y liberar el resto. El proceso no se puede interrumpir mientras esto sucede, y como habrás notado, puede tomar cientos de milisegundos.
Su frecuencia y duración de ejecución son proporcionales a la cantidad de objetos que creas y destruyes, pero a menos que la deshabilites por completo, no tienes control. Mi experiencia fue que hubo varias estrategias insatisfactorias para suavizar mi ciclo de animación de Ruby:
- GC.disable / GC.enable alrededor de bucles de animación críticos y tal vez un GC oportunista. Comience a forzarlo a ir cuando no pueda hacer ningún daño. (Debido a que mi plataforma de destino era una máquina Windows NT de 64 MB, esto ocasionaba que el sistema se quedara sin memoria de forma ocasional. Pero fundamentalmente es una mala idea, a menos que pueda precalcular cuánta memoria necesita antes de hacer esto, estoy arriesgando el agotamiento de la memoria)
- Reduzca la cantidad de objetos que crea para que el GC tenga menos trabajo que hacer (reduce la frecuencia / duración de su ejecución)
- Reescribe tu ciclo de animación en C (una salida de escape, ¡pero con la que fui!)
En estos días probablemente también vería si JRuby funcionaría como un tiempo de ejecución alternativo, ya que creo que se basa en el recolector de basura más sofisticado de Java.
El otro gran problema de rendimiento que he encontrado es la E / S básica cuando intento escribir un servidor TFTP en Ruby hace un tiempo (sí, selecciono los mejores idiomas para mis proyectos críticos para el rendimiento, esto fue solo un experimento). El bucle más simple y más simple para responder simplemente a un paquete UDP con otro, que contiene la siguiente parte de un archivo, debe haber sido aproximadamente 20 veces más lento que la versión C en stock. Sospecho que podría haber habido algunas mejoras para hacer allí en torno al uso de IO de bajo nivel (sysread, etc.), pero la lentitud podría estar en el hecho de que no hay ningún tipo de datos de byte de bajo nivel: cada pequeña lectura se copia en un Cuerda. Sin embargo, esto es solo una especulación, no llevé este proyecto mucho más allá, pero me advirtió que no dependiera de la E / S ágil.
El aumento reciente de la velocidad principal que ha seguido, aunque no estoy completamente actualizado aquí, es que la implementación de la máquina virtual se volvió a hacer para 1.9, lo que resultó en una ejecución más rápida del código. Sin embargo , no creo que el GC haya cambiado , y estoy bastante seguro de que no hay nada nuevo en el frente de E / S. Pero no estoy completamente actualizado sobre Ruby, que es el último en sangrado, para que alguien más quiera meterse aquí.
La parte más problemática es "todos".
Puntos de bonificación si ese "todos" realmente no usaba el lenguaje.
En serio, 1.9 es mucho más rápido y ahora está a la par con python, y jruby es más rápido que jython.
Los recolectores de basura están en todas partes; por ejemplo, Java tiene uno, y es más rápido que C ++ en el manejo de la memoria dinámica. Ruby no se adapta bien al crujido de números; pero son pocos los lenguajes, por lo que si tiene partes computacionales intensivas en su programa en cualquier idioma, será mejor que las reescriba en C (Java es rápido con las matemáticas debido a sus tipos primitivos, pero les fue caro, están claramente # 1 en las partes más feas del idioma).
En cuanto a las características dinámicas: no son rápidas, pero el código sin ellas en los lenguajes estáticos puede ser aún más lento; por ejemplo, java usaría una configuración XML en lugar de Ruby usando una DSL; y probablemente sea más LENTO ya que el análisis XML es costoso.
OMI, los lenguajes dinámicos son todos lentos en general. Hacen algo en tiempo de ejecución que los lenguajes estáticos hacen en el tiempo de compilación.
Comprobación de sintaxis, interpretación y verificación de tipos similares, conversión. esto es inevitable, por lo tanto, el rubí es más lento que c / c ++ / java, corrígeme si estoy equivocado.
Ruby 1.9.1 es aproximadamente dos veces más rápido que PHP, y un poco más rápido que Perl, de acuerdo con algunos puntos de referencia.
(Actualización: mi fuente es this ( screenshot ). Sin embargo, no sé cuál es su fuente).
Ruby no es lento. El antiguo 1.8 es, pero el actual Ruby no lo es.
Ruby es lento porque fue diseñado para optimizar la experiencia de los programadores, no el tiempo de ejecución del programa. La lentitud es solo un síntoma de esa decisión de diseño. Si prefiere la interpretación al placer, probablemente debería usar un idioma diferente. Ruby no es para todo.
Steve Dekorte: "Escribir una calculadora de conjunto de Mandelbrot en un lenguaje de alto nivel es como tratar de ejecutar la Indy 500 en un autobús".
http://www.dekorte.com/blog/blog.cgi?do=item&id=4047
Recomiendo aprender varias herramientas para usar la herramienta correcta para el trabajo. Hacer las transformaciones de la matriz se puede hacer de manera eficiente utilizando API de alto nivel que se envuelve en bucles ajustados con cálculos intensivos en aritmética. Consulte la gema RubyInline para ver un ejemplo de incrustación de código C o C ++ en la secuencia de comandos de Ruby.
También hay un lenguaje Io que es mucho más lento que Ruby, pero procesa películas de manera eficiente en Pixar y supera a C en aritmética vectorial mediante la aceleración SIMD.
Supongo que estás preguntando, "qué técnicas particulares en Ruby tienden a ser lentas".
Uno es instanciación de objetos. Si lo hace en grandes cantidades, quiere ver formas (razonables) de reducir eso, como usar el patrón flyweight , incluso si el uso de la memoria no es un problema. En una biblioteca en la que volví a trabajar para que no creara una gran cantidad de objetos muy similares una y otra vez, dupliqué la velocidad general de la biblioteca.
Ruby es muy bueno para entregar soluciones rápidamente. Menos para ofrecer soluciones rápidas. Depende del tipo de problema que intentas resolver. Me vienen a la mente las discusiones sobre el antiguo foro CompuServe MSBASIC a principios de los años 90: cuando se le preguntó cuál era más rápido para el desarrollo de Windows, VB o C, la respuesta habitual fue "VB, alrededor de 6 meses".
En su forma MRI 1.8, Ruby es, relativamente, lento para realizar algunos tipos de tareas intensivas en computación. Prácticamente cualquier lenguaje interpretado sufre de esa manera en comparación con la mayoría de los lenguajes compilados convencionales.
Las razones son varias: algunas bastante direccionables (la recolección de basura primitiva en 1.8, por ejemplo), otras menos.
1.9 aborda algunos de los problemas, aunque probablemente pasará algún tiempo antes de que esté disponible en general. Algunas de las otras implementaciones que se dirigen a los tiempos de ejecución preexistentes, JRuby, IronRuby, MagLev, por ejemplo, tienen el potencial de ser significativamente más rápidas.
En cuanto al rendimiento matemático, no me sorprendería ver un rendimiento bastante lento: es parte del precio que paga por precisión arbitraria. De nuevo, elige tu problema. He resuelto más de 70 problemas de Project Euler en Ruby con casi ninguna solución que requiera más de un mintue para ejecutar. ¿Qué tan rápido necesita que se ejecute y qué tan pronto lo necesita?