Lettura dalla memoria vs Esecuzione di un'operazione [chiusa]

1

Sto imparando a programmare i microcontrollori e sto cercando di sviluppare buone abitudini:

Supponiamo che abbia un set di valori che può essere calcolato in base a ciò che è già in memoria. Come regola generale, è sempre meglio calcolare i dati una volta e salvarli in memoria, oppure è sempre meglio calcolarlo ogni volta che è necessario?

La mia ipotesi sarebbe che, poiché leggere e scrivere in memoria è più lento delle operazioni del processore, sarebbe sempre meglio calcolare qualcosa ogni volta che è necessario piuttosto che memorizzare il valore in memoria, a condizione che il calcolo sia alquanto banale.

Sono corretto nel mio modo di pensare?

    
posta ridthyself 02.12.2015 - 17:24
fonte

3 risposte

1

Suppose I have a set of values which can be calculated based on what is already in memory.

Cosa c'è di più veloce: leggere dalla memoria o leggere dalla memoria ed eseguire un calcolo?

Quello che stai pensando è vero, alcuni calcoli sono più veloci di una lettura di memoria e quindi, se sei preoccupato per gli hit della cache della CPU o l'utilizzo della memoria, il ricalcolo potrebbe essere una buona cosa, ma nel caso generale, il caching non è mai una cattiva scelta. Anche quando non risparmierai tempo, hai almeno implementato un meccanismo che può essere utilizzato in seguito quando hai un valore complesso che richiede la memorizzazione nella cache.

L'unica volta che si vuole veramente evitare la cache è quando si controlla quale memoria viene caricata nella CPU. Dovendo bloccare tutto ciò per caricare un blocco di memoria solo in modo da poter leggere un valore, e quindi riempire la cache con la memoria originale può essere molto costoso (relativamente parlando). Il 99% dei programmi però non lo fa, leggere la memoria è una di quelle cose che fanno sempre, quindi una cache non fa differenza per il tempo di esecuzione. YMMV se stai scrivendo per un microcontrollore con memoria molto limitata.

    
risposta data 02.12.2015 - 17:46
fonte
2

Quando si crea la prima versione del software, ricalcolare sempre tutto. Vedete, il calcolo e la memorizzazione in memoria è caching e il caching è un'ottimizzazione, e qualsiasi ottimizzazione prima di avere un prodotto completo è un'ottimizzazione prematura, e l'ottimizzazione prematura è la radice di tutto il male .

Quindi, devi considerare che nei sistemi embedded potresti avere molte considerazioni che potresti non avere nei sistemi non incorporati.

  • In realtà hai abbastanza memoria da risparmiare per la memorizzazione nella cache?

  • Questa memoria è scrivibile all'infinito o si logora con ogni scrittura?

  • La memoria è scrivibile abbastanza velocemente? Alcune strane (per lo più vecchie) memorie sono lontane più lente da scrivere che leggere, quindi calcolare, scrivere una volta e leggere più volte potrebbe avere prestazioni paragonabili a ricalcolare più volte.

  • Il tuo codice sarà già abbastanza complesso e abbastanza difficile da eseguire il debug a causa delle peculiarità del sistema incorporato, hai davvero bisogno di complicare ulteriormente la tua vita aggiungendo il caching?

In breve, sfortunatamente no, non esiste una regola generale che dice che è sempre meglio farlo o sempre meglio farlo.

    
risposta data 02.12.2015 - 18:01
fonte
1

"Sempre" è sempre sbagliato. Non ci sono regole generali. Ogni caso è diverso

Innanzitutto, ci sono le caratteristiche del tuo processore. La velocità relativa di lettura / scrittura della memoria rispetto alle operazioni di esecuzione è enormemente diversa tra i processori. Abbastanza diverso da influenzare la decisione.

In secondo luogo, c'è la domanda su quanto spesso un risultato che è stato calcolato una volta viene utilizzato. Se si calcola un * b mille volte (con gli stessi valori a e b), quindi memorizzare il risultato e caricare quando è più probabile che sia una vittoria; se lo fai due volte, questo è molto più dubbio.

Terzo, c'è la correttezza. Se si ricalcola un * b dopo che a o b è cambiato, si ottiene il risultato corretto. Se si fa affidamento su un risultato memorizzato a * b dopo una modifica, si verifica una delle tre cose: 1. Si ottiene un risultato vecchio, non aggiornato che è errato. 2. Si controlla se aob è cambiato e si ricalcola il prodotto se necessario, che mangerà tutto o gran parte del proprio vantaggio, o 3. si ricalcola un * b in ogni luogo in cui si cambia a o b. Nessuno di questi è molto divertente e difficile da correggere.

    
risposta data 02.12.2015 - 18:09
fonte

Leggi altre domande sui tag