Mengapa tim di LMAX merancang LMAX Disruptor di Java tetapi semua poin desain mereka untuk meminimalkan penggunaan GC? Jika seseorang tidak ingin menjalankan GC maka mengapa menggunakan bahasa sampah yang dikumpulkan?
Optimalisasi mereka, tingkat pengetahuan perangkat keras dan pemikiran yang mereka buat sangat mengagumkan tetapi mengapa Java?
Saya tidak menentang Java atau apa pun, tapi mengapa bahasa GC? Mengapa tidak menggunakan sesuatu seperti D atau bahasa lain tanpa GC tetapi memungkinkan kode yang efisien? Apakah itu tim yang paling akrab dengan Jawa atau apakah Jawa memiliki beberapa keunggulan unik yang tidak saya lihat?
Katakanlah mereka mengembangkannya menggunakan D dengan manajemen memori manual, apa bedanya? Mereka harus berpikir tingkat rendah (yang sudah ada), tetapi mereka dapat memeras kinerja terbaik dari sistem karena itu asli.
Jawaban:
Karena ada perbedaan besar antara mengoptimalkan kinerja dan mematikan sepenuhnya keselamatan
Dengan mengurangi jumlah GC, kerangka kerja mereka lebih responsif dan dapat berjalan (mungkin) lebih cepat. Sekarang, mengoptimalkan pengumpul sampah tidak berarti mereka tidak pernah melakukan pengumpulan sampah. Itu hanya berarti mereka melakukannya lebih jarang, dan ketika mereka melakukannya, itu berjalan sangat cepat. Jenis optimasi tersebut meliputi:
Ketika Anda mengabaikan kinerja, Anda biasanya mencari beberapa "hot spot" yang sangat spesifik sambil mengabaikan kode yang tidak sering berjalan. Jika Anda melakukannya di Jawa, Anda dapat membiarkan pengumpul sampah tetap merawat sudut-sudut gelap itu (karena itu tidak akan membuat banyak perbedaan) sambil mengoptimalkan dengan sangat hati-hati untuk area yang berjalan dalam loop ketat. Jadi Anda dapat memilih di mana Anda mengoptimalkan dan di mana Anda tidak, dan dengan demikian Anda dapat memfokuskan upaya Anda di tempat yang penting.
Sekarang, jika Anda mematikan pengumpulan sampah sepenuhnya, maka Anda tidak dapat memilih. Anda harus membuang setiap objek secara manual . Metode itu dipanggil paling banyak sekali sehari? Di Jawa, Anda dapat membiarkannya, karena dampak kinerjanya dapat diabaikan (mungkin OK untuk membiarkan GC penuh terjadi setiap bulan). Di C ++, Anda masih membocorkan sumber daya, jadi Anda harus berhati-hati bahkan dari metode yang tidak jelas itu. Jadi, Anda harus membayar harga untuk manajemen sumber daya di setiap bagian aplikasi Anda, sementara di Jawa Anda dapat fokus.
Tapi itu semakin buruk.
Bagaimana jika Anda memiliki bug, katakanlah di sudut gelap aplikasi Anda yang hanya diakses pada hari Senin di bulan purnama? Jawa memiliki jaminan keamanan yang kuat. Ada sedikit atau tidak ada "perilaku tidak terdefinisi". Jika Anda menggunakan sesuatu yang salah, Pengecualian dilempar, program Anda berhenti, dan tidak ada kerusakan data terjadi. Jadi Anda cukup yakin bahwa tidak ada yang salah dapat terjadi tanpa Anda sadari.
Tetapi dalam sesuatu seperti D, Anda dapat memiliki akses pointer buruk, atau buffer overflow, dan Anda dapat merusak memori Anda, tetapi program Anda tidak akan tahu (Anda mematikan keselamatan, ingat?) Dan akan terus berjalan dengan salahnya data, dan melakukan beberapa hal yang cukup jahat dan merusak data Anda, dan Anda tidak tahu, dan semakin banyak korupsi terjadi, data Anda semakin salah, dan kemudian tiba-tiba rusak, dan itu dalam aplikasi yang sangat penting, dan beberapa kesalahan terjadi dalam perhitungan roket, sehingga tidak berfungsi, dan roket meledak, dan seseorang mati, dan perusahaan Anda ada di halaman depan setiap surat kabar dan bos Anda mengarahkan jarinya ke Anda mengatakan "Kamu adalah insinyur yang menyarankan agar kami menggunakan D untuk mengoptimalkan kinerja, mengapa Anda tidak memikirkan keselamatan?". Dan itu salahmu. Kamu membunuh orang-orang itu dengan upaya bodohmu dalam kinerja.
OKE, OKE, sebagian besar waktu itu jauh kurang dramatis dari itu. Tetapi bahkan aplikasi penting bisnis atau hanya aplikasi GPS atau, katakanlah, situs web layanan kesehatan pemerintah dapat menghasilkan konsekuensi yang cukup negatif jika Anda memiliki bug. Menggunakan bahasa yang mencegah mereka sepenuhnya atau gagal-cepat ketika mereka terjadi biasanya adalah ide yang sangat bagus.
Ada biaya untuk mematikan pengaman. Menjadi asli tidak selalu masuk akal. Kadang jauh lebih mudah dan lebih aman untuk hanya mengoptimalkan sedikit bahasa yang aman untuk masuk semua untuk bahasa di mana Anda dapat menembak diri sendiri dalam waktu besar. Kebenaran dan keamanan dalam banyak kasus mengalahkan beberapa nano detik yang akan Anda hilangkan dengan menghilangkan GC sepenuhnya. Disruptor dapat digunakan dalam situasi itu, jadi saya pikir LMAX-Exchange membuat panggilan yang tepat.
Tapi bagaimana dengan D khususnya? Anda memiliki GC jika Anda ingin sudut-sudut gelap, dan subset SafeD (yang saya tidak tahu sebelum mengedit) menghapus perilaku yang tidak terdefinisi (jika Anda ingat untuk menggunakannya!).
Nah dalam hal ini pertanyaan sederhana tentang kedewasaan. Ekosistem Jawa penuh dengan alat yang ditulis dengan baik dan perpustakaan yang matang (lebih baik untuk pengembangan). Lebih banyak pengembang yang tahu Java daripada D (lebih baik untuk pemeliharaan). Memilih bahasa baru dan tidak terlalu populer untuk sesuatu yang sama pentingnya dengan aplikasi finansial bukanlah ide yang bagus. Dengan bahasa yang kurang dikenal, jika Anda memiliki masalah, sedikit yang dapat membantu Anda, dan perpustakaan yang Anda temukan cenderung memiliki lebih banyak bug karena mereka terpapar pada lebih sedikit orang.
Jadi poin terakhir saya masih berlaku: jika Anda ingin menghindari masalah dengan konsekuensi yang mengerikan, tetaplah dengan pilihan yang aman. Pada titik ini dalam kehidupan D, pelanggannya adalah perusahaan baru kecil yang siap mengambil risiko gila. Jika masalah dapat menelan biaya jutaan, Anda lebih baik tinggal lebih jauh dalam kurva lonceng inovasi .
sumber
Tampaknya alasan itu ditulis di Jawa adalah bahwa mereka memiliki keahlian Java di rumah dan mungkin ditulis (meskipun masih dalam pengembangan aktif) sebelum C ++ bertindak bersama dengan C ++ 0x / 11.
Kode mereka benar-benar hanya Java dengan nama, mereka menggunakan sun.misc.Unsafe agak seperti yang mengalahkan titik Jawa dan keamanan yang seharusnya diberikan. Saya telah menulis port C ++ dari Disruptor dan mengungguli kode Java yang mereka kirimkan (saya tidak menghabiskan banyak waktu menyetel JVM).
Karena itu, prinsip-prinsip yang diikuti pengganggu tidak spesifik bahasa, mis. Jangan berharap kode C ++ latensi rendah yang dialokasikan atau dibebaskan dari heap.
sumber
Pertanyaan ini menyatakan premis yang salah sebagai fakta, lalu membuat argumen tentang premis yang salah itu.
Mari gali ini .. "semua titik desain mereka untuk meminimalkan penggunaan GC" - tidak benar. Inovasi dalam pengganggu tidak ada hubungannya dengan GC. Pengacau berkinerja karena desainnya dengan cerdik mempertimbangkan bagaimana komputer modern bekerja - sesuatu yang jauh lebih jarang daripada yang diharapkan. Lihat ceramah Cliff Click di http://www.azulsystems.com/events/javaone_2009/session/2009_J1_HardwareCrashCourse.pdf untuk diskusi.
Sudah diketahui bahwa LMax adalah pelanggan Azul. Saya tahu secara langsung bahwa dengan Azul GC bukan merupakan masalah - bahkan dengan tumpukan 175GB.
sumber
Di atas membuat separuh dari jawaban yang Anda cari. Anda dapat menemukan setengah lainnya untuk melengkapi alasannya tidak lebih jauh dari pada di blog LMAX :
Seperti yang diakui oleh pengembang LMAX, kode seperti itu mungkin cukup sulit untuk dikembangkan, dipahami, dan didebug - bahkan di Jawa. Menuju level yang lebih rendah dari tempat mereka sekarang hanya akan memperburuk masalah ini, seperti yang ditunjukkan dalam artikel Wikipedia tentang bahasa pemrograman tingkat rendah :
sumber
Jika Anda menggunakan Java sebagai bahasa sintaks dan menghindari pustaka JDK, itu bisa secepat bahasa non-GC yang dikompilasi. GC tidak cocok untuk sistem waktu nyata, tetapi dimungkinkan untuk mengembangkan sistem di Jawa yang tidak meninggalkan sampah. Akibatnya GC tidak pernah memicu.
Kami percaya bahwa bahasa dan platform Java memiliki banyak keunggulan dibandingkan C / C ++ dan kami telah mengembangkan dan membuat tolok ukur beberapa komponen Java dengan latensi rendah untuk membuktikannya. Kami berbicara tentang teknik untuk melakukannya dalam artikel ini: Pengembangan Java tanpa GC .
sumber
malloc/free
juga tidak cocok untuk waktu nyata karena waktu alokasi tidak dibatasi karena fragmentasi.LMAX adalah Perpustakaan Perpesanan Antar-Thread Berkinerja Tinggi.
Agar bermanfaat, orang lain harus menulis kode untuk mendapatkan setiap utas untuk melakukan pekerjaan yang bermanfaat. Mengingat bahwa kode tersebut kemungkinan besar berada di Java atau C # dan kemudian ada sangat sedikit pilihan bahasa yang berinteraksi dengan mereka.
Menggunakan C atau C ++ bukanlah pilihan yang baik kecuali jika Anda ingin membatasi pengguna Anda untuk satu OS, karena tidak ada model threading yang ditentukan di dalamnya.
Java adalah standar untuk banyak pengembangan perangkat lunak saat ini, jadi kecuali Anda memiliki alasan yang baik, Java cenderung menjadi pilihan terbaik. (Ketika di Roma lakukan sebagai orang Romawi ...)
Menulis perangkat lunak Kinerja Tinggi di Jawa (atau C #) sering dilakukan untuk membuktikan suatu hal ...
sumber