Saya sedang memikirkan aplikasi ilmiah yang sebagian besar terikat pada prosesor dan berat pada penggunaan tumpukan (setidaknya beberapa gigabyte). Lain waktu dalam setahun saya akan dengan senang hati pergi dengan C ++, tetapi dalam hal ini saya bertanya-tanya apakah fragmentasi alami ke manajer memori C ++ bisa menjadi masalah serius versus keuntungan dari kolektor pemadatan Java.
Adakah yang bisa menunjuk contoh dunia nyata yang terkait dengan ini?
Jawaban:
Jika Anda berbicara tentang suatu aplikasi yang terikat untuk menekankan batas-batas mesin, sehingga Anda berharap Anda akan melakukan trik pemrograman untuk menghindari melebihi batas-batas itu, maka C ++ adalah cara untuk pergi. Tidak hanya C ++ memberi Anda ruang untuk optimasi di mana Java tidak, (seperti yang Emilio tunjukkan,) tetapi juga, Sampah-Pengumpul adalah alat yang sangat haus akan memori yang membutuhkan banyak memori bebas ekstra untuk dapat bekerja secara efisien.
Jawaban untuk pertanyaan ini: StackOverflow: Berapa banyak memori tambahan yang diperlukan pengumpulan sampah ? melukis gambar yang agak suram, tetapi bahkan jika pengumpul sampah membutuhkan memori bebas hanya sebesar memori yang dialokasikan, (yang saya dengar), ini masih berarti bahwa dengan Java Anda masih membutuhkan banyak memori bebas agar dapat berjalan secara efisien.
Di sisi lain, saat ini kita umumnya lebih suka membeli perangkat keras yang lebih mahal daripada harus melakukan trik pemrograman untuk menghindari melebihi batas perangkat keras. Dalam kasus Anda, masalah RAM Anda biasanya akan diselesaikan dengan menggunakan mesin 64-bit dan melempar modul RAM sebanyak mungkin sesuai kebutuhan. Soalnya, biaya perangkat keras tidak jauh dari biaya waktu pengembangan di negara maju saat ini.
Saya pikir Anda harus serius mempertimbangkan opsi ini, dan jika mungkin, pergi dengan opsi ini dan dengan Java daripada C ++, karena jauh lebih mudah untuk mengembangkan sesuatu di Jawa daripada di C ++, dan tetap mempertahankannya setelah itu.
sumber
Masalahnya adalah tidak menggunakan C ++ karena Java dan tidak menggunakan Java karena C ++. Wadah C ++ biasanya diterapkan untuk menghindari fragmentasi berlebih, seperti yang dilakukan toko bebas Java.
Tetapi jika Anda mengalokasikan sendiri memori secara langsung, Anda juga dapat melakukan hal-hal yang tidak diizinkan oleh Java, yang dapat mengakibatkan fragmentasi.
Solusi yang tepat (dalam C ++) adalah menggunakan container dan smart-pointer melalui kelas pengalokasi yang mengelola alokasi dengan cara memperbaiki "pleks" (titik kunci, di sini, adalah menulis kelas pengalokasi yang baik). Dan ini adalah gaya pemrograman yang tidak ada hubungannya dengan Java, jadi perbandingan apa pun tidak ada artinya.
[EDIT] Ini bisa menjadi sampel yang sudah usang: Alokasi tetap
sumber
Keuntungan dari pengumpulan sampah adalah mensimulasikan mesin dengan jumlah memori yang tak terbatas. Mekanisme atau implementasi abstraksi itu dimaksudkan untuk sepenuhnya transparan bagi Anda sebagai programmer. Kita semua tahu bahwa mekanisme ini mengambil kembali memori yang tidak lagi digunakan oleh program, tetapi itu sebenarnya tidak dijamin. Jika Anda menjalankan program pada mesin dengan lebih banyak RAM daripada yang pernah digunakan oleh program, maka pengumpulan sampah mungkin tidak akan pernah terjadi. Sekali lagi, tidak relevan, karena Anda bisa menulis program tanpa memperhatikan bagaimana ia menggunakan memori. Manajer memori hanya akan mengalokasikan lebih banyak RAM setiap kali program memintanya, dan Anda boleh berasumsi bahwa alokasi tersebut akan selalu berhasil. Java adalah bahasa yang dikumpulkan sampah, dan C ++ tidak. 1
Kerugian dari pengumpulan sampah adalah, seperti semua abstraksi , cenderung bocor. Itu tidak selalu bekerja dengan sempurna sepanjang waktu, terutama dalam kasus tepi, dan Anda cenderung mengalami bug. Orang-orang yang menulis algoritma pengumpulan sampah (yang seharusnya transparan bagi Anda sebagai seorang programmer) dioptimalkan untuk kasus-kasus yang paling umum, dan masalah dengan kasus-kasus umum adalah bahwa mereka tidak pernah menjadi yang biasa. Secara umum , Anda tidak dapat melakukan yang lebih baik daripada pengumpul sampah dalam mengelola memori. Tetapi dalam keadaan tertentu (dan diberi waktu, energi, dan pengertian yang cukup), itu mungkin saja terjadi. C ++ memberi Anda fleksibilitas ini; Java tidak.
Semua itu mengatakan, saya pikir saran standar untuk memilih bahasa berlaku di sini, bahkan mungkin lebih dalam hal ini mengingat kendala. Pilih bahasa yang paling akrab bagi pengembang utama untuk proyek ini. Selain alasan yang jelas (seperti Anda akan dapat mengembangkan aplikasi lebih cepat dan lebih efisien), ini khususnyapenting dalam kasus yang Anda jelaskan karena pemrograman C ++ seperti Anda memprogram Java akan mengakibatkan praktik manajemen memori yang sangat tidak efektif, dan karenanya bocor dan macet. Secara analogi, pemrograman di Jawa seperti pemrograman pada C ++ tidak akan banyak membantu Anda, dan mungkin menghasilkan program yang kurang dioptimalkan, mengingat algoritma pengumpulan sampah di-tweak dan disetel untuk kasus-kasus yang paling umum .
Programmer yang terbiasa bekerja dalam bahasa yang dikumpulkan sampah belajar untuk mempercayai pengumpul sampah, daripada berjuang melawannya. Jika Anda bekerja dalam bahasa yang dikumpulkan sampah, ini adalah programer yang Anda inginkan pada proyek Anda. Pemrogram yang tidakterbiasa bekerja dalam bahasa yang dikumpulkan sampah secara inheren skeptis terhadap abstraksi "memori tak terbatas", dan seringkali dengan banyak alasan bagus. Sebagus apa pun pemrogram ini, ini bukan yang Anda inginkan dalam bahasa yang dikumpulkan sampah karena mereka akan berjuang melawan GC setiap langkah, terus-menerus menebaknya dan sering menghasilkan lebih lambat, kurang hemat memori kode dari jenis programmer lain. Paling-paling, mereka hanya akan menghabiskan banyak waktu untuk menciptakan kembali roda, membuat Anda menghabiskan banyak uang dan bahkan lebih banyak lagi dalam biaya perawatan jangka panjang.
Dan kemudian Anda juga perlu bertanya pada diri sendiri apakah itu benar-benar penting. Ada lebih dari sekadar isyarat kebenaran dalam komentar sinis Bo: ingatannya sangat murah sekarang, hampir tidak ada nilai terlalu banyak untuk meremas-remas tangan. Bahkan jika Anda membutuhkan jumlah besar , jumlah itu tidak sebesar sekarang 10 tahun yang lalu. Pemrogram dan pengembangan aplikasi jauh lebih mahal daripada hanya membeli sekumpulan RAM dan kekuatan pemrosesan. Itu tidak berarti bahwa Anda harus menghindari ekonomi jika memungkinkan, tetapi itu berarti Anda juga tidak boleh membuang waktu terlalu banyak untuk melakukannya.
1 Tentu saja, asumsi ini menyoroti kelemahan yang lebih dalam dalam pertanyaan. Ternyata, "Java atau C ++" sedikit herring merah. Implementasi Java standar menyediakan pengumpulan sampah dan C ++ tidak sesuai standar bahasa, tetapi sama sekali tidak ada alasan bahwa Anda tidak dapat menggunakan pengumpul sampah pihak ketiga untuk C ++. Banyak perusahaan mencari nafkah dengan menjual barang-barang ini, dan beberapa mungkin mencari nafkah dengan memberikannya secara gratis.
sumber