Takashi Kokubun: cómo hacer que las aplicaciones de Ruby se ejecuten más rápido

La Conferencia de Rubí de Rusia Central el 28 de septiembre marca 10 años. Este año, RubyRussia tiene un nuevo lugar, ¡hasta 4 transmisiones de informes seleccionados, comunicación y, por supuesto, la legendaria fiesta posterior! ¡Entre los oradores están Yukihiro Matsumoto, Takashi Kokubun, Xavier Noria, Nick Sutterer, Genadi Samokovarov y más!

En preparación, hablamos con oradores sobre Ruby, el trabajo y la vida. Hoy publicamos material en el que Dmitry Matveyev (gerente de proyecto en Evrone ) hace preguntas a Takashi Kokubun .

imagen
El orador RubyRussia 2019, un optimizador para el compilador Ruby JIT, es compatible con Haml y ERB, un ingeniero de back-end para ArmTreasure Data.

¿Dime qué se discutirá en tu informe en la conferencia?

Sobre el trabajo en el compilador JIT. Me gustaría centrarme en tres puntos. El primero es la función en línea. La función debe ser "limpia", sin efectos secundarios, para que su cuerpo pueda estar en línea. Si hay demasiadas funciones, el compilador comienza a funcionar lentamente. Describiré cómo resolver este problema.
El segundo punto se refiere a la optimización de la colocación de objetos en la memoria. En aplicaciones grandes y complejas como Rails, debe crear muchos objetos en una sola solicitud. Si optimiza este proceso, puede mejorar el rendimiento. Por lo general, los objetos se crean en el montón. Por lo tanto, debe administrar estructuras de datos complejas en él. También debe llamar al recolector de basura para eliminar los objetos no utilizados. Y si tuviéramos que colocar objetos en la pila, simplemente aumentaríamos el puntero de la pila al agregar un objeto y lo disminuiríamos cuando el objeto necesite ser eliminado. Usar la pila para almacenar objetos es más rápido en sí mismo, además el recolector de basura comienza a trabajar más rápido. Pero para usar la pila, debemos asegurarnos de que los objetos no se usen en otro lugar. Para este propósito, utilizamos una técnica llamada "análisis de escape". Necesitamos analizar cada método y asegurarnos de que cada uno de sus objetos internos no se use externamente y no se devuelva como resultado del método actual. Si podemos hacer esto, podemos colocar objetos en la pila, y esto aumentará la productividad. Mi idea es agregar metadatos para obtener instrucciones. Ahora, este es un experimento, pero voy a hacer una solicitud de extracción al maestro con este código en un futuro próximo.

El tercer punto se trata de optimizar el envío de llamadas a funciones en JIT. Actualmente, este proceso genera una fuerte ramificación de la lógica, que afecta negativamente el mecanismo de predicción de ramificación del procesador. Esto ralentiza el procesador en su conjunto. Necesitamos simplificar esta lógica, es decir, reducir el número de condiciones. Actualmente estoy explorando cómo hacer esto.

¡Este es un informe hardcore con muchos códigos y conceptos! Parece ser dificil?

Creo que la mayoría de las personas no implementan compiladores por su cuenta, y entiendo que comprender esto puede ser difícil. Pero intentaré explicar todo lo más simple posible con ejemplos e ilustraciones. Es decir, mi informe debería ser comprensible para las personas sin experiencia especial en el desarrollo de compiladores.

¿Es posible utilizar el nuevo compilador en producción ahora y en qué casos?

La idea es hacer que las aplicaciones RoR se ejecuten más rápido. Por ejemplo, mi compañía actual se beneficiará de esto. Pero no diría que todo está listo para la producción. Resultó que solo las aplicaciones RoR no están particularmente aceleradas. Esto se debe a que estas aplicaciones suelen ser grandes y generan una gran cantidad de código C, lo que conduce a un uso ineficaz del almacenamiento en caché en el procesador. Tengo algunas ideas sobre cómo solucionar esto. En eso estoy trabajando ahora. Pero ahora mi compilador puede ser útil para pequeñas aplicaciones. Por ejemplo, sé que la gema karafka funciona más rápido con ella que sin ella.

Leí que el compilador JIT ya se vierte en el maestro de brunch del lenguaje Ruby y ha estado disponible desde la versión 2.6. Es asi?

Sí, mi solicitud de fusión ya ha sido aceptada. Pero esta es la primera versión, y queda mucho trabajo por hacer. Las mejoras ya estarán en Ruby 2.7, y aún más en Ruby 3.

¿Dime cómo empezaste a escribir en Ruby?

Al principio trabajé con Objective-C, pero realmente no me gustó. Una vez que hubo necesidad de escribir una aplicación de back-end, y amigos recomendaron probar Ruby On Rails. Hice exactamente eso, ¡y quedé muy satisfecho con el resultado! Me gustó la sintaxis simple y comprensible del lenguaje, y comencé a estudiarlo y usarlo más profundamente.

¿Estás escribiendo en Ruby en el trabajo ahora?

He estado con Treasure Data durante los últimos años. Es una plataforma que rastrea los datos del usuario en las aplicaciones del cliente. Este proyecto fue escrito originalmente en Ruby On Rails, y mi publicación se llamaba "Desarrollador Ruby". Entonces escribí mucho en Ruby. Pero ahora estoy trabajando en algunos servicios distribuidos escritos en Java y Kotlin, y también a veces uso Python.

El proyecto Treasure Data está asociado con alta carga y big data. Pero Ruby no es el idioma más rápido. ¿Cómo logró crear una aplicación de alta carga que funcione con Big Data en la plataforma RoR?

La aplicación registra los datos del usuario y los guarda en el almacenamiento. También proporciona una interfaz para consultar datos en idiomas como Hive y Presto, y un panel de administración. No fue un problema escribirlo todo sobre rieles. Además, creamos una infraestructura competente y tenemos la capacidad de aumentar los recursos de memoria y procesador en las cargas máximas. El principal problema que tenemos con Ruby es que no es adecuado para la computación paralela. Y tenemos que usar Kotlin para este propósito.

¿Por qué amas a Ruby? Si hubiera un proyecto que pudiera implementarse tanto en Ruby como en Python, ¿cuál elegirías?

Me gusta la sintaxis limpia de Ruby, es muy legible e intuitiva. Esto le permite escribir rápida y fácilmente la lógica de la aplicación, lo cual es importante desde el punto de vista comercial. Este es un lenguaje puramente objeto, realmente lo aprecio. Tengo experiencia en Python, pero no me parece tan intuitivo. Lo elegiría solo para proyectos de aprendizaje automático.

Otra cosa en la que has estado trabajando últimamente es el motor de plantillas Haml ...

Trabajé en Haml y ERB en un trabajo anterior. Ahora no dedico demasiado tiempo a esto, pero a veces miro a través de misiones de extracción en estos proyectos.

¿Qué opina sobre las perspectivas de los motores de plantillas como Haml, Slim o ERB, en general, dado que en el mundo moderno existe una tendencia a separar completamente el reverso y el frente en dos aplicaciones diferentes, y dar la formación de páginas HTML completamente a JavaScript? Es decir, en tal configuración, ¿los motores de plantilla se vuelven completamente innecesarios?

Estoy de acuerdo en que para tareas con una interfaz de usuario compleja tiene sentido colocar esta lógica en una aplicación separada. Esto debe hacerse para competir con otras empresas, que aumentan cada vez más la complejidad y la funcionalidad de la interfaz de usuario. Pero aún existe la necesidad de soluciones más simples y, lo que es más importante, más económicas que tengan sentido escribir en RoR con motores de plantilla clásicos. Por lo tanto, todavía están en funcionamiento y se utilizarán durante mucho tiempo.

Veo que puedes programar en muchos idiomas, al menos en Ruby, Python, Java, Kotlin y C. Un buen conjunto. ¿Puedes dar consejos para principiantes sobre cómo aprender tantos idiomas? ¿Cómo convertirse en un buen programador?

Creo que la efectividad de la capacitación será alta cuando el lenguaje sea adecuado para las tareas que enfrenta un programador. Ruby es bueno para escribir aplicaciones web, porque trabajar con cadenas es muy fácil en comparación con Java. Python es más adecuado para el aprendizaje automático (tiene una infraestructura rica en esta área). Si desea aprender Python, recomendaría resolver tareas de aprendizaje automático en lugar de escribir aplicaciones web. Si está más interesado en Java, Kotlin u otros lenguajes basados ​​en JVM, le sugiero que escriba sistemas distribuidos. Actualmente, Ruby no es adecuado para computación exigente o paralela. Para resolver estos problemas en Ruby, necesitamos muchos procesos que consuman muchos recursos, por lo que no serán efectivos. Por lo tanto, el uso de herramientas apropiadas para problemas relevantes ayudará a comprender por qué esta herramienta está diseñada de esta manera. Esto ayudará a comprender mejor su esencia.

¿Qué libros están en la parte superior de su "calificación" personal?

El primero es Ruby bajo un microscopio. Está escrito de manera muy simple y describe los detalles del intérprete. Una comprensión profunda de cómo funciona el intérprete ayudará a resolver problemas complejos y también agregará confianza en la propiedad de la herramienta, es decir. lengua Recomiendo este libro incluso para principiantes.

El segundo es "Código legible". Se trata de cómo escribir código claro, por extraño que parezca :). Escribimos mucho código y leemos mucho código, y debemos ser capaces de escribir código que otros entiendan. Y para esto, tenemos que mirar el código desde el ángulo de la percepción de otra persona. Libros como este ayudan. También lo recomiendo incluso para principiantes. Bueno, el tercer libro ... Este es un libro en japonés, sobre cómo está organizado el procesador, sobre su arquitectura, hasta los transistores en que consiste. A veces es muy útil comprender cómo funciona una computadora a un nivel tan bajo, incluso cuando se resuelven problemas a niveles mucho más altos. Recomiendo leer cualquier buen libro sobre diseño de microprocesador, incluso si a primera vista esto parece obvio.

¿Qué esperas de Rusia y la conferencia RubyRussia ?

Nunca he estado en Rusia antes. Espero ver muchas cosas hermosas, por ejemplo, hermosas casas, hermosos paisajes ... Además, en Rusia debería ser más frío que en Japón. Será interesante para mí ver y sentir todas estas diferencias entre nuestros países.

Genial! Les puedo asegurar que incluso si hace frío (de hecho, a fines de septiembre no hace tanto frío con nosotros), ¡la conferencia y la fiesta posterior estarán calientes de todos modos!

¡También te esperamos en la conferencia! Puede hacer sus preguntas en persona (y en la legendaria fiesta posterior :) el 28 de septiembre. El programa está aquí , y el boleto ahora cuesta 9,000 rublos.

Gracias a las empresas que apoyan RubyRussia :

Organizador - Evrone
Socio general - Toptal
Gold Partner - Gett
Silver Partners - JetBrains y Bookmate
Socio de bronce - InSales

Source: https://habr.com/ru/post/466305/


All Articles