Apakah Scala 3 Membuat Kami Menjadi Lebih Lambat?
(kmaliszewski9.github.io)- Selama proses migrasi codebase dari Scala 2.13 ke Scala 3, terjadi penurunan performa yang tidak terduga
- Pada pengujian awal dan lingkungan deployment, semua metrik terlihat normal, namun beberapa jam kemudian lag Kafka meningkat
- Hasil load test menunjukkan adanya penurunan throughput yang tajam saat memproses pesan yang terperinci
- Melalui analisis async-profiler, terungkap bahwa penyebabnya adalah bug inefisiensi evaluasi chain pada library Quicklens
- Setelah library diperbarui, performa pulih, dan ditekankan perlunya kewaspadaan terhadap perbedaan perilaku library antar versi Scala
Proses Migrasi Layanan
- Layanan yang ada sebelumnya dipindahkan dari Scala 2.13 ke Scala 3.7.3
- Ini adalah layanan yang berfokus pada pengumpulan data tanpa menggunakan macro, dengan performa sebagai aspek penting
- Setelah menerapkan perubahan pada dependensi, opsi compiler, tipe, dan sintaks, kompilasi berhasil
- Di lingkungan pengujian dan deployment bertahap, log dan metrik semuanya tampak normal
- Metrik di tingkat infrastruktur, JVM, dan aplikasi semuanya dikonfirmasi dalam kondisi sehat
Penurunan Performa dengan Penyebab yang Tidak Jelas
- Sekitar 5–6 jam setelah deployment, terjadi peningkatan lag Kafka
- Bahkan ketika tidak ada lonjakan data, throughput per instance menurun
- Setelah rollback, throughput segera pulih, yang mengonfirmasi bahwa perubahan kode adalah penyebabnya
Analisis Performa dan Pelacakan Penyebab
- Dalam load test, pada awalnya regresi performa tidak berhasil direproduksi
- Penurunan throughput yang tajam hanya terjadi pada payload yang terperinci dan heterogen
- Library dependensi (serialisasi, DB SDK, image Docker, library konfigurasi, dan lainnya) dikembalikan satu per satu untuk diuji, tetapi tidak ada perubahan
- Hasil profiling CPU dengan async-profiler menunjukkan bahwa,
- Di Scala 3, penggunaan CPU oleh compiler JIT dan tahap decoding meningkat tajam
- Di bagian atas flamegraph, pemanggilan Quicklens memakan setengah dari total waktu CPU
- Di Scala 2.13, pemanggilan yang sama hanya berada di kisaran 0,5%
Akar Penyebab Masalah
- Bug inefisiensi evaluasi chain pada library Quicklens muncul di Scala 3
- Perbaikan terkait telah diterapkan dalam GitHub PR #115
- Setelah library diperbarui, perbedaan performa antara Scala 3 dan 2.13 pun hilang
Pelajaran dan Rekomendasi
- Ketergantungan library pada metaprogramming dapat menyebabkan perbedaan performa antar versi Scala
- Meskipun migrasi selesai dengan normal, hotspot dan titik bottleneck tetap harus dibenchmark
- Untuk layanan yang sensitif terhadap performa, alih-alih berasumsi “berjalan dengan baik”, validasi berbasis pengukuran nyata itu wajib
- Diperlukan pemeriksaan awal untuk mencegah situasi di mana benchmark, bukan kode, yang mengungkap bottleneck
1 komentar
Opini Hacker News
Blog teknis memang seharusnya ditulis seperti ini. Sulit membayangkan AI bisa menggantikan alur berpikir setingkat ini
Pertanyaan pertamanya sederhana — “kenapa harus upgrade?”
inlinebekerja sebagai bagian dari sistem makroJika
inlinedipakai pada parameter, compiler diarahkan untuk meng-inline ekspresi di titik pemanggilanTetapi jika ini besar, bebannya menjadi sangat berat bagi compiler JIT
Di Scala 2,
@inlinehanya berupa saran, tetapi di 3 diterapkan tanpa syaratJadi, sekadar mengganti
@inlinemenjadiinlineadalah kesalahan besarregisterdi C/C++ lamaAwalnya bersifat memaksa, tetapi seiring optimisasi berkembang, ia menjadi sekadar rekomendasi lalu akhirnya diabaikan
inlinedi C++ juga mengalami proses serupainlinehampir di mana-manaTujuannya untuk menghilangkan overhead lambda pada fungsi seperti
mapHampir tidak ada masalah performa, tetapi jika digabung dengan sistem makro Scala, ekspresi kompleks bisa muncul dan mungkin menimbulkan masalah
Saya juga pernah mengalami hal serupa saat upgrade Ruby 2→3
Bukan cuma bahasanya yang perlu dinaikkan, tetapi seluruh dependensi juga harus dimutakhirkan agar sistem stabil
Masalah inferensi tipe di Scala 2 tetap belum terselesaikan, sementara yang berubah justru bahasanya
Jadinya seperti membuat produk yang tidak diinginkan siapa pun sambil mengabaikan kebutuhan pasar
PS: compiler benar-benar perlu punya suite unit test yang layak
Namun rewrite Scala 3 gagal menyelesaikan kecepatan kompilasi dan masalah tooling, dan proyeknya kehilangan momentum sepenuhnya
Rasanya sulit membayangkan ada orang yang memulai proyek baru dengan Scala pada 2025
Scala terasa seperti bahasa buatan akademisi, dan justru aneh kalau dulu sempat populer di industri
Sekarang semua tool harus menyesuaikan diri dengan Scala 3, dan bahkan IntelliJ pun masih belum mendukungnya sepenuhnya
Andai Scala 2 ditingkatkan secara bertahap, bukannya fokus pada keberhasilan akademis saja
Misalnya, seperti di tulisan tpolecat, bahkan soal
early returnpun masih diperdebatkan, padahal Kotlin mendukungnya tanpa masalahCompiler Scala punya ribuan hingga puluhan ribu test, dan
direktori test resmi serta
sistem community build memverifikasi jutaan LOC
Ini особенно wajib saat menghadapi perubahan besar seperti upgrade versi bahasa
Kami terus melakukan benchmark pada tool yang ditulis dalam C++, tetapi sulit menjaga konsistensi hasil karena noise lingkungan
Kami sedang mempertimbangkan cara membandingkan dengan menjalankannya berulang kali di mesin yang sama
Masalahnya adalah membuat sintaks kedua lalu mendorongnya sebagai masa depan
Ini juga memperlambat ekosistem tooling
Gaya penulisan juga bisa dikonversi otomatis dengan compiler atau scalafmt
Kini ada dua kali lipat: sintaks kurung kurawal dan sintaks indentasi
Sintaks
matchterasa terlalu bertele-tele dan seperti meniru PythonWaktu itu Scala sempat mendapat sorotan berkat Spark, tetapi kehilangan kesempatan berkembang sebagai bahasa komersial
Sekarang Spark bergerak ke Python, dan posisi bahasa modern di JVM diambil Kotlin
Pada akhirnya Scala terasa kembali menjadi bahasa akademis
Itu bisa dilihat di Scala Adoption Tracker
Fitur-fitur baru Scala 3 masih punya potensi untuk kembali menginovasi ekosistem bahasa
Contoh: penjelasan tentang Capture Checking
Java menambahkan fitur-fitur fungsional dan menyerap sebagian daya tarik Scala
Dalam pengalaman saya, permintaan pasar juga minim
Itu terjadi hanya karena Google membatasi dukungan Java
Di seluruh pasar JVM, pangsa Kotlin hanya sekitar 10%
Jika Anda menjalani audit keamanan (PIC-DSS dan sebagainya), menjaga library tetap terbaru adalah hal wajib
Saya justru cenderung membiarkan dependensi tetap lama
Versi baru membawa bug baru, perubahan maintainer, dan juga risiko keamanan
Sepertinya awalnya hanya sebagian yang dinaikkan. Membaginya ke langkah-langkah kecil itu umum, tetapi kali ini mereka kurang beruntung
Masalahnya bukan Scala 3 itu sendiri, melainkan interaksi beberapa faktor
Tetapi untuk library khusus Scala, versi Scala sering ikut masuk ke nomor versinya sehingga perlu diperhatikan
Daya ekspresif Scala dan type safety-nya terlihat menonjol
Seperti di tulisan Li Haoyi, bahasa ini juga cukup menarik sebagai alternatif Python
Ini makin penting jika banyak library yang terlalu bergantung pada fitur-fitur magic