Qual è la differenza tra Caching e Memoization?


114

Vorrei sapere qual è la differenza effettiva tra cachinge memoization.
Per come la vedo io, entrambi implicano evitare ripetute chiamate di funzione per ottenere dati archiviandoli .

Qual è la differenza principale tra i due?


Mi chiedo se si possa dire "la memorizzazione sta nella cache" come "l'array sta nell'array sparse". In altre parole, memorizzi solo le cose "su richiesta" anziché enumerare ogni possibile combinazione di input.
Sridhar Sarnobat

Risposte:


110

La memorizzazione è una forma specifica di memorizzazione nella cache che implica la memorizzazione nella cache del valore restituito di una funzione in base ai suoi parametri .

La memorizzazione nella cache è un termine più generale; ad esempio, la memorizzazione nella cache HTTP è la memorizzazione nella cache ma non la memorizzazione.

Wikipedia dice :

Sebbene correlata alla memorizzazione nella cache, la memorizzazione si riferisce a un caso specifico di questa ottimizzazione, distinguendolo da forme di memorizzazione nella cache come il buffering o la sostituzione della pagina.


2
ma puoi sempre circondare la parte in cui la cache viene utilizzata con una funzione e chiamarla "memoization". anche se la differenza è che hai il controllo della politica di memorizzazione nella cache nella tua funzione, mentre la memoizzazione è di ordine superiore e avviene al di fuori della funzione, immagino.
nicolas

Perché la memorizzazione nella cache HTTP non viene memorizzata? anche questo si basa sul parametro (l'URL della risorsa richiesta).
topo Ripristina Monica il

@topomorto: a causa di caratteristiche come If-Matche scadenze. La memorizzazione ha senso solo per la funzione pura, cosa che raramente è HTTP.
SLaks

@nicolas, non proprio, credo. Penso che nella memoizzazione il termine "funzione" sia usato in senso puro / matematico. Scaricare una pagina web da un dato indirizzo non può essere considerato una funzione, perché può succedere che la pagina cambi.
Alexey

@Alexey non vale la stessa osservazione per la memorizzazione nella cache? tutte queste strategie si basano sulla stessa chiamata di funzione che fornisce lo stesso risultato, ovvero nessun effetto collaterale a monte .
nicolas

47

Come li ho visti usati, "memoization" è "mettere in cache il risultato di una funzione deterministica" che può essere riprodotto in qualsiasi momento a parità di funzione e input.

La "memorizzazione nella cache" include fondamentalmente qualsiasi strategia di bufferizzazione dell'output, indipendentemente dal fatto che il valore della sorgente sia riproducibile o meno in un dato momento. In effetti, il caching viene utilizzato anche per fare riferimento a strategie di bufferizzazione dell'input , come la cache di scrittura su un disco o una memoria. Quindi è un termine molto più generale.


Sei sicuro che la funzione debba essere deterministica?
Gherman

4
@ Tedesco, sì, la memorizzazione dipende dal determinismo. L'esempio classico è un algoritmo ricorsivo, come la sequenza di Fibonacci o fattoriale. Invece di rielaborare fino al caso base, una funzione memoizzata andrebbe in cortocircuito riutilizzando i risultati precedenti per i valori già calcolati. Questo ovviamente dipende dallo stesso input che produce sempre lo stesso output, che è la definizione di determinismo. La memorizzazione nella cache, d'altra parte, viene spesso utilizzata per processi non deterministici (ad esempio casuali o con timestamp), con la consapevolezza che i risultati potrebbero non corrispondere a un valore "aggiornato".
arpione

6

Penso che il termine caching venga solitamente utilizzato quando si archiviano i risultati delle operazioni di I / O, o fondamentalmente tutti i dati che arrivano dall'esterno (file, rete, query db). La memorizzazione dei termini di solito si applica alla memorizzazione dei risultati dei propri calcoli, ad esempio nel contesto della programmazione dinamica.


1

La memorizzazione è una forma speciale di memorizzazione nella cache il risultato di una funzione deterministica. Ciò significa che memorizzare nella cache il risultato al di fuori della funzione non è memoizzazione perché la funzione dovrebbe mutare la cache quando calcola un nuovo risultato (non già nella cache), quindi non sarebbe più una funzione (pura). La memorizzazione generalmente implica il passaggio della cache come argomento aggiuntivo (in una funzione di supporto). La memorizzazione ottimizzerà le funzioni che devono calcolare i valori più volte per un singolo accesso. La memorizzazione nella cache ottimizzerà le funzioni chiamate più volte con gli stessi parametri. In altre parole, Memoization ottimizzerà il primo accesso se la memorizzazione nella cache ottimizzerà solo gli accessi ricorrenti.


0

Vorrei aggiungere alle altre ottime risposte che la memorizzazione è anche nota come tabling . Penso che sia importante conoscere questo termine anche per coloro che imparano cosa sono la memorizzazione e il caching.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.