Pilih C ++ atau Java untuk aplikasi yang membutuhkan RAM dalam jumlah besar? [Tutup]

11

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?

dsign
sumber
Saya tidak berpikir bahasanya sama pentingnya dengan pemrograman dalam kasus ini. Bahasa matang apa pun mungkin dapat bekerja tergantung pada skala perhitungan Anda. Ada Javas, C / C ++, bahkan Python dan Rubi yang dapat meluncur ke peran ini. Beberapa akan lebih sulit daripada yang lain karena sepertinya Anda benar-benar harus memiliki kepastian yang kuat bahwa Anda tidak membocorkan memori.
Rig
2
Jika Anda bisa mendapatkan GB seharga $ 7,99, apakah itu masalah? Kingston 1GB DDR3
Bo Persson
2
@ BoPersson, dalam pengalaman saya, orang-orang yang memiliki masalah seperti itu mulai dengan mengisi penuh motherboard kelas atas mereka dan mengeluh bahwa mereka tidak dapat menempatkannya sebanyak yang mereka inginkan, dan kemudian memberi makan data yang ditetapkan sebesar yang dapat dikelola dan kemudian mengeluh bahwa itu tidak cukup.
Pemrogram
@ surat, di hari-hari ini di mana Anda bisa mendapatkan motherboard menerima beberapa ratusan pertunjukan memori kurang dari 1000 €, beberapa pertunjukan tidak terlalu berat dalam penggunaan memori.
Pemrogram
1
Setuju dengan bagian memori murah. Adapun pengembangan, saya telah di C ++ untuk sementara waktu dan praktik pengkodean yang baik membuat kebocoran fenomena yang agak jarang; sebenarnya, saya lebih suka C ++ daripada java dalam hal itu.
dsign

Jawaban:

11

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.

Mike Nakis
sumber
Terima kasih atas jawaban anda. Saya setuju dengan ilustrasi perangkat keras Anda.
dsign
Jika Anda tidak peduli dengan program berhenti sementara pengumpulan sampah berjalan, kebutuhan memori jauh lebih kecil.
1
Saya tidak setuju dengan paragraf terakhir. Java tidak selalu lebih mudah untuk dikembangkan daripada C ++. Itu tidak cocok untuk saya, karena saya telah melakukan banyak C ++ dan relatif sedikit Java dalam lima atau enam tahun terakhir. Dimungkinkan untuk menulis kode yang dapat dipelihara dan tidak dapat dipelihara baik dalam C ++ dan Java.
David Thornley
1
@ Davidvidhorn Saya telah melakukan C / C ++ selama 10+ tahun, dan Java selama 6+ tahun. Saya menemukan Java lebih mudah dalam semua hal: membuat prototipe, mengembangkan, memperluas, dan memelihara. Tetapi bagaimanapun juga, itulah yang seharusnya dilakukan oleh pendapat: berbeda . C -: =
Mike Nakis
Adakah di antara Anda yang diprogram untuk proyek big-data, lapar prosesor? Ada komentar di sana?
dsign
7

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

Emilio Garavaglia
sumber
Terima kasih atas jawaban Anda, Emilio. Saya sadar akan fleksibilitas C ++ dan merasa cenderung untuk setuju dengan Anda. Kemudian lagi, saya ingin tahu beberapa contoh penggunaan nyata di mana teknik ini telah digunakan untuk sukses.
dsign
@sign: Pos diedit, lihat tautan
Emilio Garavaglia
1
Saya menggunakan teknik ini sebelumnya. Aplikasi yang berkinerja buruk memiliki pengalokasi berubah untuk menggunakan satu set tumpukan blok tetap. Jadi ketika Anda menginginkan blok 4 byte, itu berasal dari heap yang hanya menyimpan blok 4-byte. Jika Anda menginginkan 5 byte, itu berasal dari tumpukan blok 8-byte, dll. Peningkatan kinerja (untuk aplikasi kami yang banyak mengalokasikan) luar biasa. Anda mungkin tidak mendapatkan hasil yang baik, tetapi ini bisa sangat efektif. Ada juga nol fragmentasi karena semua allocs datang dalam blok tetap.
gbjbaanb
2

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.

Cody Grey
sumber