Memoizzazione, memorizzazione nella cache, buffer e archiviazione di pagine?

7

Sto scrivendo qualcosa su come Fibonacci iterativo è sostanzialmente migliore di Fibonacci ricorsivo: poche righe. La ragione principale di ciò è che, come molti ricercatori importanti ritengo, è che non si ricalcolano i valori: spazio vs tempo. Da questo ho pensato ah ha! al caching! Ma non sono sicuro che si tratti di memorizzazione nella cache, memoization, buffering o uno degli altri.

Personalmente ritengo che il buffering sia il precaricamento del materiale prima che qualcosa venga fatto con esso, mentre il caching e la memorizzazione sono più una cosa basata sull'elaborazione. La nozione di buffering è che ottengo da tale buffering un'immagine o un video.

Qual è la differenza tra buffering, memoization, caching e page arching?

    
posta Eiyrioü von Kauyf 25.04.2012 - 18:17
fonte

2 risposte

6

Il caching è correlato a tutti gli altri concetti che hai menzionato, se stavi parlando di una gerarchia di concetti, il caching sarebbe il concetto genitore e la memoizzazione, alcune forme di buffering e i file di pagina sono forme specifiche di caching.

La Memoizzazione sta memorizzando i valori precalcolati e quindi li usa per cercare i valori piuttosto che spendere del tempo per ricalcolarli. (time vs space tradeoff)

Buffering Suppongo che tu ti stia riferendo a cose come IO bufferizzate, che possono essere utilizzate nel software o nell'hardware. Nel codice, è possibile utilizzare i flussi bufferizzati come in Java o C #, che manterranno una certa quantità di dati in memoria in modo che i programmi non debbano attendere l'accesso lento alla rete o al disco. Questo non è specificamente nella cache.

I buffer hardware come nei dischi rigidi memorizzano nella cache una piccola quantità di dati per un accesso rapido. Questi sono controllati da algoritmi e previsioni che, se i dati sono stati utilizzati molto di recente, saranno probabilmente utilizzati nuovamente molto presto.

I file di pagina sono un po 'diversi - è una cache, ma è principalmente per risolvere il problema di ciò che accade quando il tuo programma ha bisogno di avere molti dati in memoria, ma non abbastanza memoria per archiviare quei dati? In ambienti con molti programmi in esecuzione, sono stati creati file di pagina per risolvere questo problema che potresti avere RAM molto limitata (condivisa da tutte le app) ma molto più spazio di archiviazione che potrebbe essere utilizzato in modo trasparente per archiviare i dati del programma oltre alla RAM (ma significativamente più lento).

Tuttavia, come menzionato da Peter Smith, gli algoritmi iterativi rispetto a quelli ricorsivi non sono intrinsecamente memo- rizzati o nulla (a meno che non si stiano utilizzando costrutti o linguaggi che utilizzano la memoizzazione trasparente). Le chiamate ricorsive richiedono chiamate di funzioni esponenziali inserite nello stack e, a meno che il linguaggio / compilatore non utilizzi l'eliminazione della ricorsione di coda, questo può essere più lento e causare anche overflow dello stack.

È possibile memoizzare soluzioni ricorsive o iterative.

    
risposta data 25.04.2012 - 18:54
fonte
0

Fibonacci iterativo rispetto a Fibonacci ricorsivo ha più a che fare con il fatto che i compilatori in genere non trasformano le funzioni ricorsive non di coda in funzioni iterative. La differenza tra questi due è mantenere le variabili in pila (e in memoria) per ricorsive, mantenendo due variabili nei registri risparmiando tonnellate di accessi di memoria per iterativo.

Non è memoization poiché non si mantiene una tabella di valori precalcolati (cosa che potrebbe essere eseguita in entrambi gli scenari). Memoizzazione e memorizzazione nella cache sono quasi la stessa cosa, entrambi comportano la memorizzazione di risultati precompilati in una chiave, a meno che non ci si preoccupi della cache fisica della CPU e si preoccupi dell'allineamento della cache.

Il buffering sta semplicemente riempiendo lo spazio di memoria tramite I / O da un dispositivo lento come una rete o un disco rigido, rispetto all'elaborazione del flusso di byte byte per byte, che è lento a causa di molti accessi di I / O.

    
risposta data 25.04.2012 - 18:42
fonte

Leggi altre domande sui tag