Setiap kali Anda memiliki aplikasi yang memiliki jalur kritis intensif kinerja, Anda harus memperhatikan bagaimana Anda memperlakukan memori. Sebagian besar aplikasi sisi klien pengguna akhir tidak termasuk dalam kategori ini karena mereka didorong oleh peristiwa utama dan sebagian besar peristiwa berasal dari interaksi dengan pengguna, dan yang tidak memiliki banyak kendala kinerja (jika ada sama sekali).
Namun, banyak perangkat lunak back-end harus memiliki fokus pada bagaimana memori ditangani karena banyak perangkat lunak yang dapat ditingkatkan untuk menangani jumlah klien yang lebih tinggi, jumlah transaksi yang lebih besar, lebih banyak sumber data .... Begitu Anda mulai Mendorong batas, Anda dapat mulai menganalisis bagaimana memori pengguna perangkat lunak Anda dan menulis skema alokasi khusus yang dirancang untuk perangkat lunak Anda daripada mengandalkan pengalokasi memori yang sepenuhnya generik yang ditulis untuk menangani setiap kasus penggunaan yang dapat dibayangkan.
Untuk memberi Anda beberapa contoh ... di perusahaan pertama saya, saya bekerja pada paket Sejarawan, perangkat lunak yang bertanggung jawab untuk mengumpulkan / menyimpan / pengarsipan data kontrol proses (pikirkan pabrik, pembangkit listrik tenaga nuklir atau kilang minyak dengan 10 dari jutaan sensor, kami akan menyimpan data itu). Setiap kali kami menganalisis hambatan kinerja yang mencegah Sejarawan memproses lebih banyak data, sebagian besar masalahnya adalah bagaimana memori ditangani. Kami telah berusaha keras untuk memastikan malloc / free tidak dipanggil kecuali mereka benar-benar diperlukan.
Dalam pekerjaan saya saat ini, saya mengerjakan perekam video digital dan paket analisis pengawasan. Pada 30 fps, setiap saluran menerima bingkai video setiap 33 milidetik. Pada perangkat keras yang kami jual, kami dapat dengan mudah merekam 100 saluran video. Jadi itu kasus lain untuk memastikan bahwa di jalur kritis (panggilan jaringan => tangkap komponen => perangkat lunak manajemen perekam => komponen penyimpanan => disk) tidak ada alokasi memori dinamis. Kami memiliki pengalokasi bingkai khusus, yang berisi ember buffer ukuran tetap dan menggunakan LIFO untuk menggunakan kembali buffer yang sebelumnya dialokasikan. Jika Anda membutuhkan penyimpanan 600Kb, Anda mungkin berakhir dengan buffer 1024Kb, yang membuang-buang ruang, tetapi karena itu dirancang khusus untuk penggunaan kami di mana setiap alokasi sangat berumur pendek, itu bekerja dengan sangat baik karena buffer digunakan,
Dalam jenis aplikasi yang saya jelaskan (memindahkan banyak data dari A ke B dan menangani sejumlah besar permintaan klien) pergi ke tumpukan dan kembali adalah sumber utama kemacetan kinerja CPU. Menjaga tumpukan fragmentasi ke minimum adalah manfaat sekunder, namun sejauh yang saya tahu sebagian besar OS modern sudah menerapkan tumpukan fragmentasi rendah (minimal saya tahu Windows melakukannya, dan saya berharap yang lain juga melakukannya). Secara pribadi, dalam 12+ tahun bekerja di lingkungan seperti ini, saya telah melihat masalah penggunaan CPU yang berhubungan dengan heap cukup sering, sementara tidak pernah sekalipun saya melihat sistem yang sebenarnya menderita heap yang terfragmentasi.