Önbelleğe Alma ve Hafızaya Alma arasındaki fark nedir?


114

Ne gerçek arasındaki fark bilmek istiyorum cachingve memoizationolduğunu.
Gördüğüm kadarıyla, her ikisi de verileri depolayarak almak için tekrarlanan işlev çağrılarından kaçınmayı içeriyor .

İkisi arasındaki temel fark nedir?


Merak ediyorum, "dizi seyrek dizi" olarak "memoization caching içindir" diyebilir misiniz? Başka bir deyişle, her olası girdi kombinasyonunu numaralandırmak yerine yalnızca "istek üzerine" her şeyi saklarsınız.
Sridhar Sarnobat

Yanıtlar:


110

Memoization, bir fonksiyonun dönüş değerinin parametrelerine göre önbelleğe alınmasını içeren belirli bir önbelleğe alma biçimidir .

Önbelleğe alma daha genel bir terimdir; örneğin, HTTP önbelleğe alma, önbelleğe almaktır, ancak hafızaya alma değildir.

Wikipedia diyor ki :

Önbelleğe alma ile ilgili olmasına rağmen, notlandırma, arabelleğe alma veya sayfa değiştirme gibi önbelleğe alma biçimlerinden ayıran bu optimizasyonun belirli bir durumunu ifade eder.


2
ama her zaman önbelleğin bir işlevle kullanıldığı ve ona "memoization" adını verdiği kısmı aşabilirsiniz. ancak fark, işlevinizdeki önbelleğe alma politikasının kontrolünüzde olmasına rağmen, not alma daha yüksek sıradadır ve tahmin ettiğim işlevin dışında gerçekleşir.
nicolas

HTTP Önbelleğe Alma neden ezberleme değil? bu aynı zamanda parametreye (istenen kaynağın URL'si) bağlıdır.
topo Monica'yı Yeniden

@topomorto: Gibi özellikler If-Matchve sona erme nedeniyle . Memoization yalnızca HTTP'nin nadiren olduğu saf işlev için anlamlıdır.
SLaks

@nicolas, tam olarak değil, sanırım. Ben de düşünüyorum memoization terimi "işlev" saf / matematiksel anlamda kullanılır. Belirli bir adresten bir web sayfasının indirilmesi bir işlev olarak kabul edilemez çünkü sayfa değişebilir.
Alexey

@Alexey aynı açıklama önbelleğe alma için geçerli değil mi? tüm bu stratejiler, aynı sonucu veren aynı işlev çağrısına dayanır, yani yukarı akış yan etkisi yoktur .
nicolas

47

Onların kullanıldığını gördüğüm gibi, "hafızaya alma", aynı fonksiyon ve girdiler verildiğinde herhangi bir zamanda yeniden üretilebilen "deterministik bir fonksiyonun sonucunu önbelleğe almaktır".

"Önbelleğe alma", kaynak değerin belirli bir zamanda yeniden üretilebilir olup olmadığına bakılmaksızın, temelde herhangi bir çıktı tamponlama stratejisini içerir. Aslında, önbelleğe alma, bir disk veya bellekteki yazma önbelleği gibi girdi arabelleğe alma stratejilerine atıfta bulunmak için de kullanılır . Dolayısıyla çok daha genel bir terimdir.


Fonksiyonun deterministik olması gerektiğinden emin misiniz?
Gherman

4
@Alman, evet, hatırlatma determinizme bağlıdır. Klasik örnek, Fibonacci dizisi veya faktöriyel gibi özyinelemeli bir algoritmadır. Hafızaya alınmış bir fonksiyon, temel duruma kadar yeniden hesaplama yapmak yerine, önceden hesaplanmış olan değerler için önceki sonuçları yeniden kullanarak kısa devre yapacaktır. Bu açıkça aynı girdinin her zaman aynı çıktıyı vermesine bağlıdır, bu determinizmin tanımıdır. Öte yandan, önbelleğe alma, sonuçların "yenilenmiş" bir değerle eşleşmeyebileceği anlayışıyla sıklıkla deterministik olmayan (örneğin rastgele veya zaman damgalı) süreçler için kullanılır.
harpo

6

Sanırım önbelleğe alma terimi genellikle GÇ işlemlerinin sonuçlarını veya temelde size dışarıdan gelen herhangi bir veriyi (dosyalar, ağ, db sorguları) depoladığınızda kullanılır. Terim hafızası, genellikle, örneğin dinamik programlama bağlamında, kendi hesaplamalarınızın sonuçlarını depolamak için geçerlidir.


1

Memoization, deterministik bir işlevin sonucunu önbelleğe almanın özel bir biçimidir. Bu, sonucun işlevin dışında önbelleğe alınmasının hatırlama olmadığı anlamına gelir çünkü işlev yeni bir sonuç hesaplarken (zaten önbellekte değil) önbelleği değiştirmek zorunda kalır, böylece artık bir (saf) işlev olmaz. Hafızaya alma genellikle önbelleğin ek bir argüman olarak (bir yardımcı işlevde) geçirilmesini ifade eder. Hafızaya alma, tek bir erişim için değerleri birkaç kez hesaplaması gereken işlevleri optimize edecektir. Önbelleğe alma, aynı parametrelerle birkaç kez çağrılan işlevleri optimize eder. Başka bir deyişle, Memoization, önbelleğe alma yalnızca tekrarlayan erişimleri optimize edip etmeyecekse, ilk erişimi optimize edecektir.


0

Diğer harika cevaplara, notlandırmanın aynı zamanda masaya yatırma olarak da bilindiğini eklemek isterim . Hafızaya alma ve önbelleğe almanın ne olduğunu öğrenenler için bu terimi bilmenin de önemli olduğunu düşünüyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.