Anda sepertinya mengajukan dua pertanyaan yang agak berbeda:
- Apakah Java benar-benar lambat, dan jika demikian mengapa?
- Mengapa Java dianggap lambat, meskipun lebih cepat daripada banyak alternatif?
Pertanyaan pertama kurang lebih merupakan pertanyaan "berapa panjang tali". Itu datang ke definisi Anda tentang "lambat". Dibandingkan dengan penerjemah murni, Java sangat cepat. Dibandingkan dengan bahasa lain yang (biasanya) dikompilasi ke semacam bytecode, kemudian secara dinamis dikompilasi ke kode mesin (misalnya C # atau apa pun di .NET) Java kira-kira setara. Dibandingkan dengan bahasa yang biasanya dikompilasi dengan kode mesin murni, dan memiliki (sering besar) tim orang yang mengerjakan apa pun selain meningkatkan pengoptimalisasi mereka (mis. C, C ++, Fortran, Ada) Java melakukan beberapa hal dengan sangat baik , tetapi secara keseluruhan cenderung setidaknya agak lambat.
Banyak dari hal ini terkait terutama dengan implementasi - pada dasarnya, ini tergantung pada kenyataan bahwa pengguna sedang menunggu saat kompiler dinamis / JIT berjalan, jadi kecuali Anda memiliki program yang berjalan cukup lama untuk memulainya, itu sulit untuk dibenarkan karena kompiler menghabiskan banyak waktu untuk optimasi yang sulit. Oleh karena itu, kebanyakan kompiler Java (dan C #, dll.) Tidak melakukan banyak upaya untuk optimasi yang sangat sulit. Dalam banyak kasus, ini kurang tentang apa yang dilakukan optimasi, daripada di mana mereka diterapkan. Banyak masalah optimisasi selesai NP, sehingga waktu yang dibutuhkan tumbuh dengan cepat dengan ukuran masalah yang diserang. Salah satu cara untuk menjaga waktu tetap masuk akal adalah dengan hanya menerapkan optimasi pada sesuatu seperti fungsi tunggal pada suatu waktu. Saat itu hanya pengembang yang menunggu kompiler, Anda dapat mengambil lebih banyak, dan menerapkan optimasi yang sama untuk potongan yang jauh lebih besar dari program ini. Demikian juga, kode untuk beberapa optimasi cukup berbulu (dan karenanya bisa sangat besar). Sekali lagi, karena pengguna menunggu sementara kode itu dimuat (dan waktu startup JVM sering merupakan faktor penting dalam keseluruhan waktu), implementasi harus menyeimbangkan waktu yang disimpan di satu tempat vs hilang di tempat lain - dan mengingat betapa sedikitnya kode manfaat dari optimasi berbulu, menjaga JVM kecil biasanya lebih bermanfaat.
Masalah kedua adalah bahwa dengan Java, Anda sering mendapatkan solusi yang lebih atau kurang "satu ukuran cocok untuk semua". Sebagai contoh, bagi banyak pengembang Java, Swing pada dasarnya adalah satu - satunya perpustakaan windowing yang tersedia. Dalam sesuatu seperti C ++, ada lusinan perpustakaan windowing, kerangka kerja aplikasi, dll., Masing-masing dengan kompromi sendiri antara kemudahan penggunaan vs eksekusi cepat, tampilan dan rasa yang konsisten vs tampilan dan nuansa asli, dan sebagainya. Satu-satunya titik pelekatan yang nyata adalah bahwa beberapa (misalnya Qt) bisa sangat mahal (setidaknya untuk penggunaan komersial).
Ketiga banyak kode yang ditulis dalam C ++ (dan C bahkan lebih) hanya lebih tua dan lebih matang. Pada banyak itu berisi inti dari rutinitas yang ditulis beberapa dekade yang lalu, ketika menghabiskan waktu ekstra mengoptimalkan kode itu normal, perilaku yang diharapkan. Itu sering kali memiliki manfaat nyata dalam kode yang lebih kecil dan lebih cepat. C ++ (atau C) mendapatkan kredit untuk kode yang kecil dan cepat, tetapi itu benar-benar lebih merupakan produk dari pengembang dan kendala waktu kode ditulis. Sampai taraf tertentu, ini mengarah pada ramalan yang terpenuhi dengan sendirinya - ketika orang peduli dengan kecepatan, mereka sering memilih C ++ karena memiliki reputasi itu. Mereka menggunakan waktu dan tenaga ekstra untuk optimasi, dan generasi baru kode C ++ cepat ditulis.
Sebagai rangkuman, implementasi Java yang normal membuat optimalisasi maksimal menjadi masalah. Lebih buruk lagi, di mana Java terlihat , hal-hal seperti windowing toolkit dan waktu startup JVM sering memainkan peran yang lebih besar daripada kecepatan eksekusi bahasa itu sendiri. Dalam banyak kasus, C dan C ++ juga mendapatkan kredit untuk apa sebenarnya produk dari hanya bekerja lebih keras dalam pengoptimalan.
Adapun pertanyaan kedua, saya pikir itu sebagian besar masalah sifat manusia di tempat kerja. Beberapa fanatik membuat klaim yang agak meningkat tentang Jawa yang sangat cepat. Seseorang mencobanya, dan menemukan bahwa bahkan sebuah program sepele membutuhkan beberapa detik untuk memulai, dan terasa lambat dan kikuk ketika dijalankan. Sedikit yang mungkin repot menganalisis hal-hal untuk menyadari bahwa sebagian besar dari ini adalah waktu startup JVM, dan fakta bahwa ketika mereka pertama kali mencoba hal-hal, belum ada kode yang dikompilasi - beberapa kode ditafsirkan, dan beberapa disusun sementara mereka menunggu. Lebih buruk lagi, bahkan ketika itu berjalan cukup cepat, tampilan dan rasa biasanya akan terasa asing dan canggung bagi sebagian besar pengguna, jadi bahkan jika pengukuran objektif menunjukkan waktu respon yang cepat, itu masih tampak canggung.
Menambahkan itu bersama-sama mengarah pada reaksi yang cukup sederhana dan alami: bahwa Jawa lambat, jelek dan canggung. Mengingat hype mengatakan itu sangat cepat, ada kecenderungan untuk bereaksi berlebihan dan menyimpulkan menganggapnya sangat lambat, alih-alih (lebih akurat) "sedikit lebih lambat, dan yang sebagian besar dalam keadaan tertentu." Ini umumnya paling buruk bagi pengembang yang menulis beberapa program pertama dalam bahasa tersebut. Eksekusi program "hello world" di sebagian besar bahasa muncul seketika, tetapi di Jawa ada jeda yang mudah terlihat saat JVM dijalankan. Bahkan seorang penerjemah murni yang berjalan jauh lebih lambat di loop ketat dan semacam itu masih akan sering muncul lebih cepat untuk kode seperti ini, hanya karena dapat dimuat dan mulai menjalankan sedikit lebih cepat.