Apakah manajemen memori dalam pemrograman menjadi masalah yang tidak relevan?
Manajemen memori (atau kontrol) sebenarnya adalah alasan utama saya menggunakan C dan C ++.
Memori sekarang relatif murah.
Memori tidak cepat. Kami masih melihat sejumlah kecil register, seperti cache data 32KB untuk L1 di i7, 256KB untuk L2, dan 2MB untuk L3 / core. Yang mengatakan:
Jika kita tidak berbicara dalam hal platform target dengan batasan ketat pada memori yang berfungsi (yaitu sistem tertanam dan sejenisnya), haruskah penggunaan memori menjadi perhatian saat memilih bahasa tujuan umum hari ini?
Penggunaan memori pada tingkat umum, mungkin tidak. Saya sedikit tidak praktis dalam hal saya tidak suka ide notepad yang mengambil, katakanlah, 50 megabita DRAM dan ratusan megabita ruang hard disk, meskipun saya punya itu untuk cadangan dan lebih banyak. Saya sudah ada untuk waktu yang lama dan itu terasa aneh dan agak menjengkelkan bagi saya untuk melihat aplikasi sederhana seperti itu mengambil memori yang relatif begitu banyak untuk apa yang harus dilakukan dengan kilobyte. Yang mengatakan, aku mungkin bisa hidup dengan diriku sendiri jika aku menghadapi hal seperti itu jika masih bagus dan responsif.
Alasan mengapa manajemen memori penting bagi saya di bidang saya bukan untuk mengurangi penggunaan memori secara umum. Ratusan megabyte penggunaan memori tidak serta merta memperlambat aplikasi dengan cara apa pun yang tidak sepele jika tidak ada memori yang sering diakses (mis: hanya dengan klik tombol atau bentuk input pengguna lain, yang sangat jarang terjadi kecuali Anda berbicara tentang pemain Starcraft Korea yang mungkin mengklik tombol sejuta kali per detik).
Alasan pentingnya dalam bidang saya adalah untuk mendapatkan memori yang kencang dan berdekatan yang sangat sering diakses (mis: dilingkarkan di setiap frame tunggal) di jalur kritis tersebut. Kami tidak ingin memiliki cache miss setiap kali kami mengakses hanya satu dari sejuta elemen yang perlu semua diakses dalam satu loop setiap frame tunggal. Ketika kita memindahkan memori ke hierarki dari memori lambat ke memori cepat dalam potongan besar, katakanlah garis cache 64 byte, akan sangat membantu jika 64 byte itu semua berisi data yang relevan, jika kita dapat memasukkan beberapa elemen senilai data ke dalam 64 byte itu, dan jika pola akses kami sedemikian rupa sehingga kami menggunakan semuanya sebelum data diusir.
Data yang sering diakses untuk sejuta elemen mungkin hanya menjangkau 20 megabyte meskipun kami memiliki gigabytes. Itu masih membuat dunia perbedaan dalam frame rate pengulangan data yang setiap frame diambil jika memori ketat dan berdekatan untuk meminimalkan kesalahan cache, dan di situlah manajemen memori / kontrol sangat berguna. Contoh visual sederhana pada bola dengan beberapa juta simpul:
Di atas sebenarnya lebih lambat dari versi saya yang bisa berubah karena ini menguji representasi struktur data persisten dari sebuah mesh, tetapi dengan itu selain itu, saya dulu berjuang untuk mencapai frame rate seperti itu bahkan pada setengah data itu (memang perangkat kerasnya telah menjadi lebih cepat sejak perjuangan saya. ) karena saya tidak memahami meminimalkan kesalahan cache dan penggunaan memori untuk data mesh. Jerat adalah beberapa struktur data tersulit yang pernah saya tangani dalam hal ini karena mereka menyimpan begitu banyak data yang saling bergantung yang harus tetap sinkron seperti poligon, tepi, simpul, sebanyak peta tekstur yang ingin dilampirkan pengguna, bobot tulang, peta warna, set pilihan, target morph, bobot tepi, bahan poligon, dll. dll. dll.
Saya telah merancang dan mengimplementasikan sejumlah sistem mesh dalam beberapa dekade terakhir dan kecepatannya seringkali sangat proporsional dengan penggunaan memori mereka. Meskipun saya bekerja dengan memori yang jauh lebih banyak daripada ketika saya mulai, sistem mesh baru saya lebih dari 10 kali lebih cepat dari desain pertama saya (hampir 20 tahun yang lalu) dan sebagian besar karena mereka menggunakan sekitar 1/10 dari Ingatan. Versi terbaru bahkan menggunakan kompresi yang diindeks untuk menjejalkan data sebanyak mungkin, dan meskipun memproses overhead dekompresi, kompresi sebenarnya meningkatkan kinerja karena, sekali lagi, kami memiliki memori cepat yang sangat sedikit berharga. Sekarang saya dapat memuat jutaan poligon mesh dengan koordinat tekstur, edge edge, penugasan material, dll. Bersama dengan indeks spasial untuknya dalam sekitar 30 megabyte.
Inilah prototipe yang bisa berubah-ubah dengan lebih dari 8 juta segi empat dan skema pembagian banyak pada i3 dengan GF 8400 (ini dari beberapa tahun yang lalu). Ini lebih cepat daripada versi saya yang tidak dapat diubah tetapi tidak digunakan dalam produksi karena saya telah menemukan versi yang tidak dapat diubah ini jauh lebih mudah untuk dipertahankan dan performa yang dicapai tidak terlalu buruk. Perhatikan bahwa bingkai gambar tidak menunjukkan segi, tetapi tambalan (kabel sebenarnya kurva, jika tidak seluruh jala akan menjadi hitam pekat), meskipun semua titik dalam segi diubah oleh sikat.
Jadi, saya hanya ingin menunjukkan beberapa hal di atas untuk menunjukkan beberapa contoh nyata dan area di mana manajemen memori sangat membantu dan juga mudah-mudahan orang tidak berpikir saya hanya berbicara tentang pantat saya. Saya cenderung sedikit kesal ketika orang mengatakan memori sangat banyak dan murah, karena itu berbicara tentang memori lambat seperti DRAM dan hard drive. Ini masih sangat kecil dan sangat berharga ketika kita berbicara tentang memori cepat, dan kinerja untuk jalur yang benar-benar kritis (yaitu, kasus umum, bukan untuk semuanya) berkaitan dengan bermain dengan sejumlah kecil memori cepat dan menggunakannya sebaik mungkin. .
Untuk hal semacam ini, sangat membantu untuk bekerja dengan bahasa yang memungkinkan Anda mendesain objek tingkat tinggi seperti C ++, misalnya, sementara masih dapat menyimpan objek-objek ini dalam satu atau lebih array yang berdekatan dengan jaminan bahwa memori dari semua objek tersebut akan direpresentasikan secara berdekatan dan tanpa overhead memori yang tidak diperlukan per objek (mis: tidak semua objek memerlukan refleksi atau pengiriman virtual). Ketika Anda benar-benar pindah ke area yang sangat kritis terhadap kinerja, itu sebenarnya menjadi dorongan produktivitas untuk memiliki kontrol memori seperti itu, katakanlah, mengutak-atik kumpulan objek dan menggunakan tipe data primitif untuk menghindari overhead objek, biaya GC, dan untuk menjaga agar memori sering diakses bersama berdekatan.
Jadi manajemen / kontrol memori (atau ketiadaannya) sebenarnya adalah alasan utama dalam kasus saya untuk memilih bahasa apa yang paling produktif memungkinkan saya untuk mengatasi masalah. Saya benar-benar menulis bagian kode saya yang tidak kritis terhadap kinerja, dan untuk itu saya cenderung menggunakan Lua yang cukup mudah untuk di-embed dari C.