Takashi Kokubun: cara membuat aplikasi Ruby berjalan lebih cepat

Konferensi Ruby Rusia Tengah pada tanggal 28 September menandai 10 tahun. Tahun ini, RubyRussia memiliki tempat baru, sebanyak 4 aliran laporan terpilih, komunikasi dan, tentu saja, after-party yang legendaris! Di antara pembicara adalah Yukihiro Matsumoto, Takashi Kokubun, Xavier Noria, Nick Sutterer, Genadi Samokovarov dan banyak lagi!

Dalam persiapan, kami berbicara dengan pembicara tentang Ruby, pekerjaan, dan kehidupan. Hari ini kami menerbitkan materi di mana Dmitry Matveyev (manajer proyek di Evrone ) mengajukan pertanyaan kepada Takashi Kokubun .

gambar
Speaker RubyRussia 2019, pengoptimal untuk kompiler Ruby JIT, mendukung Haml dan ERB, seorang insinyur backend di ArmTreasure Data.

Katakan apa yang akan dibahas dalam laporan Anda di konferensi?

Tentang bekerja pada kompiler JIT. Saya ingin fokus pada tiga poin. Yang pertama adalah fungsi inlining. Fungsinya harus "bersih", tanpa efek samping, sehingga tubuhnya bisa sejajar. Jika ada terlalu banyak fungsi, kompiler mulai bekerja lambat. Saya akan menjelaskan cara mengatasi masalah ini.
Poin kedua menyangkut optimalisasi penempatan objek dalam memori. Dalam aplikasi besar dan kompleks seperti Rails, Anda perlu membuat banyak objek dalam satu permintaan. Jika Anda mengoptimalkan proses ini, Anda dapat meningkatkan kinerja. Biasanya objek dibuat di heap. Karena itu, Anda harus mengelola struktur data yang kompleks di dalamnya. Anda juga harus memanggil pengumpul sampah untuk menghapus objek yang tidak digunakan. Dan jika kita menempatkan objek di stack, kita hanya akan meningkatkan pointer stack ketika menambahkan objek dan menguranginya ketika objek tersebut perlu dihapus. Menggunakan tumpukan untuk menyimpan objek lebih cepat, plus pengumpul sampah mulai bekerja lebih cepat. Tetapi untuk menggunakan stack, kita perlu memastikan bahwa objek tidak digunakan di tempat lain. Untuk tujuan ini, kami menggunakan teknik yang disebut "analisis melarikan diri". Kita perlu menganalisis setiap metode dan memastikan bahwa masing-masing objek internalnya tidak digunakan secara eksternal dan tidak dikembalikan sebagai hasil dari metode saat ini. Jika kita dapat melakukan ini, kita dapat meletakkan objek di tumpukan, dan ini akan meningkatkan produktivitas. Ide saya adalah menambahkan metadata untuk instruksi. Sekarang ini adalah percobaan, tapi saya akan melakukan penarikan kembali ke master dengan kode ini dalam waktu dekat.

Poin ketiga adalah tentang mengoptimalkan pengiriman panggilan fungsi di JIT. Saat ini, proses ini menghasilkan logika bercabang yang kuat, yang berdampak buruk pada mekanisme prediksi cabang prosesor. Ini memperlambat prosesor secara keseluruhan. Kita perlu menyederhanakan logika ini, yaitu mengurangi jumlah kondisi. Saat ini saya sedang mengeksplorasi cara melakukan ini.

Ini adalah laporan hardcore dengan banyak kode dan konsep! Sepertinya sulit?

Saya pikir kebanyakan orang tidak mengimplementasikan kompiler sendiri, dan saya mengerti bahwa memahami ini bisa sulit. Tetapi saya akan mencoba menjelaskan semuanya sesederhana mungkin dengan contoh dan ilustrasi. Artinya, laporan saya harus dapat dimengerti oleh orang-orang tanpa pengalaman khusus dalam pengembangan compiler.

Apakah mungkin untuk menggunakan kompiler baru dalam produksi sekarang, dan dalam kasus apa?

Idenya adalah untuk membuat aplikasi RoR berjalan lebih cepat. Sebagai contoh, perusahaan saya saat ini akan mendapat manfaat dari ini. Tetapi saya tidak akan mengatakan bahwa semuanya siap untuk produksi. Ternyata hanya aplikasi RoR yang tidak terlalu dipercepat. Ini karena aplikasi seperti itu biasanya besar, dan menghasilkan banyak kode C, yang mengarah pada penggunaan caching yang tidak efisien dalam prosesor. Saya punya beberapa ide tentang cara memperbaikinya. Itulah yang sedang saya kerjakan sekarang. Tetapi sekarang kompiler saya dapat berguna untuk aplikasi kecil. Sebagai contoh, saya tahu bahwa permata karafka bekerja lebih cepat daripada tanpa permata itu.

Saya membaca bahwa kompiler JIT sudah dituangkan ke master brunch bahasa Ruby dan telah tersedia sejak versi 2.6. Benarkah begitu?

Ya, permintaan gabung saya sudah diterima. Tetapi ini adalah versi pertama, dan masih banyak pekerjaan yang harus dilakukan. Perbaikan sudah ada di Ruby 2.7, dan bahkan lebih banyak lagi di Ruby 3.

Katakan bagaimana Anda mulai menulis di Ruby?

Awalnya saya bekerja dengan Objective-C, tetapi saya tidak terlalu menyukainya. Pernah ada kebutuhan untuk menulis aplikasi backend, dan teman-teman merekomendasikan mencoba Ruby On Rails. Saya melakukan hal itu - dan sangat senang dengan hasilnya! Saya menyukai sintaksis bahasa yang sederhana dan dapat dimengerti, dan saya mulai belajar dan menggunakannya lebih dalam.

Apakah Anda menulis dalam Ruby di kantor sekarang?

Saya telah dengan Data Harta selama beberapa tahun terakhir. Ini adalah platform yang melacak data pengguna dalam aplikasi klien. Proyek ini awalnya ditulis dalam Ruby On Rails, dan posting saya disebut "Pengembang Ruby." Jadi saya banyak menulis di Ruby. Tetapi sekarang saya sedang mengerjakan beberapa layanan terdistribusi yang ditulis dalam Java dan Kotlin, dan juga terkadang menggunakan Python.

Proyek Data Harta dikaitkan dengan data besar dan beban besar. Tapi Ruby bukan bahasa tercepat. Bagaimana Anda mengatur untuk membuat aplikasi beban tinggi yang bekerja dengan data besar pada platform RoR?

Aplikasi merekam data pengguna dan menyimpannya di penyimpanan. Ini juga menyediakan antarmuka untuk menanyakan data dalam bahasa seperti Hive dan Presto, dan panel admin. Tidak masalah menulis semuanya di atas rel. Plus, kami membuat infrastruktur yang kompeten dan memiliki kemampuan untuk meningkatkan memori dan sumber daya prosesor pada beban puncak. Masalah utama yang kami miliki dengan Ruby adalah tidak cocok untuk komputasi paralel. Dan kita harus menggunakan Kotlin untuk tujuan ini.

Mengapa kamu mencintai Ruby? Jika ada proyek yang dapat diimplementasikan dalam Ruby dan Python, mana yang akan Anda pilih?

Saya suka sintaksis Ruby yang bersih, sangat mudah dibaca dan intuitif. Ini memungkinkan Anda menulis logika aplikasi dengan cepat dan mudah, yang penting dari sudut pandang bisnis. Ini adalah bahasa objek murni, saya sangat menghargainya. Saya memiliki pengalaman dalam Python, tetapi bagi saya itu tampaknya tidak intuitif. Saya hanya akan memilihnya untuk proyek pembelajaran mesin.

Hal lain yang telah Anda kerjakan belakangan ini adalah mesin template Haml ...

Saya bekerja di Haml dan ERB di pekerjaan sebelumnya. Sekarang saya tidak mencurahkan terlalu banyak waktu untuk ini, tetapi kadang-kadang saya melihat melalui pencarian-menarik dalam proyek-proyek ini.

Apa yang Anda pikirkan tentang prospek mesin templat seperti Haml, Slim atau ERB, secara umum, mengingat bahwa di dunia modern ada kecenderungan untuk benar-benar memisahkan bagian belakang dan depan menjadi dua aplikasi yang berbeda, dan memberikan pembentukan halaman HTML sepenuhnya ke JavaScript? Artinya, dalam konfigurasi seperti itu, mesin templat menjadi sama sekali tidak perlu?

Saya setuju bahwa untuk tugas-tugas dengan antarmuka pengguna yang kompleks masuk akal untuk menempatkan logika ini dalam aplikasi terpisah. Ini harus dilakukan untuk bersaing dengan perusahaan lain, yang semakin meningkatkan kompleksitas dan fungsionalitas UI. Tetapi masih ada kebutuhan untuk solusi yang lebih sederhana dan, yang lebih penting, lebih murah yang masuk akal untuk menulis di RoR dengan mesin template klasik. Dengan demikian, mereka masih beroperasi dan akan digunakan untuk waktu yang lama.

Saya melihat bahwa Anda dapat memprogram dalam banyak bahasa, setidaknya dalam Ruby, Python, Java, Kotlin dan C. Satu set yang baik. Bisakah Anda memberi saran kepada pemula tentang cara belajar banyak bahasa? Bagaimana cara menjadi programmer yang baik?

Saya pikir efektivitas pelatihan akan tinggi ketika bahasa tersebut cocok untuk tugas-tugas yang dihadapi seorang programmer. Ruby baik untuk menulis aplikasi web, karena bekerja dengan string di dalamnya sangat mudah dibandingkan dengan Java. Python lebih cocok untuk pembelajaran mesin (memiliki infrastruktur yang kaya di bidang ini). Jika Anda ingin belajar Python, saya akan merekomendasikan menyelesaikan tugas pembelajaran mesin daripada menulis aplikasi web. Jika Anda lebih tertarik pada Java, Kotlin, atau bahasa berbasis JVM lainnya, saya sarankan untuk menulis sistem terdistribusi. Ruby saat ini tidak cocok untuk komputasi yang menuntut atau paralel. Untuk mengatasi masalah seperti itu di Ruby, kami membutuhkan banyak proses yang menghabiskan banyak sumber daya, sehingga tidak akan efektif. Dengan demikian, penggunaan alat yang tepat untuk masalah yang relevan akan membantu untuk memahami mengapa alat ini dirancang dengan cara ini. Ini akan membantu untuk lebih memahami esensinya.

Buku apa yang ada di bagian atas "peringkat" pribadi Anda?

Yang pertama adalah Ruby di bawah mikroskop. Ini ditulis dengan sangat sederhana dan menggambarkan rincian penerjemah. Pemahaman yang mendalam tentang bagaimana penerjemah bekerja akan membantu dalam memecahkan masalah yang kompleks, dan juga akan menambah kepercayaan dalam kepemilikan alat, yaitu. lidah Saya merekomendasikan buku ini bahkan untuk pemula.

Yang kedua adalah "Kode yang Dapat Dibaca". Ini tentang cara menulis kode yang jelas, anehnya :). Kami menulis banyak kode dan membaca banyak kode, dan kami harus dapat menulis kode yang dimengerti orang lain. Dan untuk ini, kita perlu melihat kode dari sudut persepsi orang lain. Buku seperti ini bisa membantu. Saya juga merekomendasikannya bahkan kepada pemula. Nah, buku ketiga ... Ini adalah buku dalam bahasa Jepang, tentang bagaimana prosesor diatur, tentang arsitekturnya, hingga transistor yang dikandungnya. Memahami bagaimana komputer bekerja pada level yang rendah terkadang sangat berguna bahkan ketika memecahkan masalah di level yang jauh lebih tinggi. Saya merekomendasikan membaca buku bagus tentang desain mikroprosesor, meskipun jika dilihat sekilas ini sepertinya tidak terlihat.

Apa yang Anda harapkan dari Rusia dan konferensi RubyRusia ?

Saya belum pernah ke Rusia sebelumnya. Saya berharap bahwa saya akan melihat banyak hal yang indah, misalnya, rumah yang indah, pemandangan yang indah ... Selain itu, harus lebih dingin di Rusia daripada di Jepang. Akan menarik bagi saya untuk melihat dan merasakan semua perbedaan antara negara-negara kita.

Keren! Saya dapat meyakinkan Anda bahwa bahkan jika itu dingin (pada kenyataannya, pada akhir September tidak begitu dingin dengan kami), konferensi dan after-party akan tetap panas!

Kami juga menunggu Anda di konferensi! Anda dapat mengajukan pertanyaan Anda secara langsung (dan di acara pesta legendaris :) pada 28 September. Programnya ada di sini , dan tiketnya sekarang berharga 9.000 rubel.

Terima kasih kepada perusahaan yang mendukung RubyRussia :

Penyelenggara - Evrone
Mitra Umum - Toptal
Mitra Emas - Gett
Mitra Perak - JetBrains dan Bookmate
Mitra Perunggu - InSales

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


All Articles