Apa Itu Memoization Dalam JavaScript
Memoization ialah teknik pengoptimalan yang ampuh yang digunakan dalam pemrograman computer untuk mempercepat eksekusi fungsi dengan menyimpan hasilnya ke cache. Ini sangat berguna ketika bertemu dengan fungsi yang mahal secara komputasi atau sering dipanggil. JavaScript, sebagai bahasa yang aktif dan fleksibel, menyediakan berbagai langkah untuk mengimplementasikan Memoization. Pada artikel berikut, kita akan mempelajari Memoization dalam JavaScript, mengeksplorasi ide, manfaat, dan berbagai pendekatan penerapannya.
Pada dasarnya, Memoization mengikutsertakan penyimpanan hasil panggilan fungsi yang mahal dan mengembalikan hasil yang di-cache ketika input yang serupa terjadi kembali. Ini menghilangkan penghitungan yang terlalu berlebih dan secara signifikan meningkatkan kinerja program. Ide dasar dibalik Memoization dapat dirangkum dalam tiga cara:
- Check apakah hasil untuk set input tertentu telah di-cache.
- Bila hasilnya ditemukan, kembalikan.
- Bila tidak, hitung hasilnya, simpan dalam cache, dan kembalikan.
Silahkan pertimbangkan contoh simpel untuk mengilustrasikan ide Memoization. Misalnya kita mempunyai fungsi yang disebut fibonacci
yang menghitung deret Fibonacci. Fibonacci angka n
ialah jumlah dari dua angka Fibonacci sebelumnya. Tanpa Memoization, fungsi fibonacci
dapat diimplementasikan seperti berikut:
function fibonacci(n) {
if (n <= 1) {
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
Implementasi ini mempunyai kompleksitas waktu eksponensial, yang bermakna melakukan penghitungan terlalu berlebih untuk nilai yang serupa, yang menyebabkan eksekusi tidak efektif. Dengan menerapkan Memoization, kita bisa meningkatkan kinerja fungsi fibonacci
secara drastis.
Salah satunya langkah untuk mengimplementasikan Memoization dalam JavaScript dengan menggunakan object cache untuk menyimpan hasil yang dihitung. Berikut contoh bagaimana kita bisa memodifikasi fungsi fibonacci
untuk memasukkan hafalan:
function fibonacci(n, cache = {}) {
if (n <= 1) {
return n;
}
if (cache[n]) {
return cache[n];
}
const result = fibonacci(n - 1, cache) + fibonacci(n - 2, cache);
cache[n] = result;
return result;
}
Dalam versi modifikasi ini, kami memperkenalkan cache
parameter tambahan dengan nilai default object kosong {}
. Object cache
berfungsi sebagai penyimpanan untuk nilai Fibonacci yang dihitung sebelumnya. Kami pertama-tama mengecek apakah hasil untuk n
yang diberikan berada di cache. Bila ya, kami mengembalikan hasil yang di-cache secara langsung. Bila tidak, kami menghitung nilai Fibonacci seperti biasa, menyimpannya di cache, dan mengembalikannya.
Pendekatan ini meningkatkan kompleksitas waktu fungsi fibonacci
dari eksponensial menjadi linier, membuatnya lebih efektif. Karena fungsinya dipanggil secara rekursif, hasil antara akan di-cache, menghindari perhitungan yang terlalu berlebih.
Pendekatan lain untuk Memoization dalam JavaScript melibatkan penggunaan fungsi tingkat tinggi. Kita bisa membuat fungsi tingkat tinggi yang disebutkan memoize
yang menggunakan fungsi sebagai input dan mengembalikan versi memo dari fungsi tersebut. Berikut contoh penerapannya:
function memoize(func) {
const cache = {};
return function(...args) {
const key = JSON.stringify(args);
if (cache[key]) {
return cache[key];
}
const result = func.apply(this, args);
cache[key] = result;
return result;
};
}
Fungsi memoize
membuat object cache dan mengembalikan fungsi anonim yang bertindak sebagai versi memoized dari fungsi aslinya. Dalam fungsi anonim, pertama-tama kita membuat kunci unik dengan merangkai argument input menggunakan JSON.stringify
. Kami kemudian mengecek apakah hasil untuk kunci yang diberikan berada di cache. Bila ya, kami mengembalikan hasil yang di-cache. Bila tidak, kami memanggil fungsi asli menggunakan func.apply(this, args)
untuk mempertahankan konteks yang benar dan meneruskan argument. Kami menyimpan hasilnya di cache dan mengembalikannya.
Untuk menggunakan fungsi memoize
, kita bisa membungkus fungsi apa saja yang ingin kita memoize. Berikut contoh bagaimana kita bisa menerapkan memoize
ke fungsi fibonacci
:
const fibonacciMemoized = memoize(fibonacci);
Saat ini, fibonacciMemoized
ialah versi memo dari fungsi fibonacci
. Setiap kali kita memanggil fibonacciMemoized(n)
,hasilnya akan dihitung dan di-cache jika perlu.
Memoization dalam JavaScript menawarkan beberapa manfaat. Pertama, meningkatkan kinerja fungsi yang melibatkan penghitungan mahal atau panggilan rekursif dengan menghilangkan penghitungan terlalu berlebih. Ini bisa menyebabkan percepatan yang signifikan, terutama untuk fungsi dengan logika kompleks atau input besar.
Kedua, Memoization meningkatkan code readability and maintainability. Dengan memisahkan caching logic dari fungsi aslinya, code menjadi lebih bersih serta lebih mudah dipahami. Selain itu, bila fungsi yang sama dipanggil berkali-kali dengan masukan yang sama, versi memo akan mengembalikan hasilnya langsung dari cache, mengurangi kerumitan keseluruhan dan meningkatkan efektivitas code.
Tetapi, Memoization bukanlah silver bullet dan mungkin tidak cocok untuk semua scenario. Itu harus digunakan bijaksana, dengan mempertimbangkan beberapa faktor seperti ukuran ruang input dan pertukaran di antara penggunaan memory dan perolehan kinerja. Fungsi dengan sebagian kecil kemungkinan masukan atau yang mempunyai efek samping mungkin bukan kandidat yang baik untuk Memoization.
Kesimpulan
Memoization ialah teknik yang berharga untuk mengoptimalkan eksekusi fungsi dalam JavaScript. Ini meningkatkan kinerja dengan menyimpan hasil yang dihitung dan mengembalikannya untuk panggilan berikutnya dengan input yang sama. JavaScript menyediakan berbagai pendekatan untuk mengimplementasikan Memoization, termasuk menggunakan object cache atau fungsi tingkat tinggi. Dengan menerapkan Memoization dengan tepat, pengembang dapat meningkatkan efektivitas dan daya responsif code mereka, terutama saat menangani tugas intensif komputasi.