Posiziona le variabili usate frequentemente dalla stessa funzione sull'heap?

3

Dì che ho la seguente situazione:

void myFunc()
{
    int x;
    //Do something with x
}

"x" è posto in pila senza dubbio veloce.

Ora, "myFunc" viene chiamato molto frequentemente, diciamo 10 volte al secondo. È plausibile fare qualcosa del genere:

int x;
void myFunc()
{
    //Do something with x
}

in modo che x venga allocato nel segmento di dati delle applicazioni. ma è assegnato solo una volta. Dal momento che "myFunc" viene chiamato così frequentemente, il secondo approccio offre vantaggi in termini di prestazioni?

    
posta Nitkov 06.02.2015 - 09:53
fonte

2 risposte

16

Assegnare una variabile sullo stack e deallocarla è una semplice addizione e sottrazione del puntatore dello stack. Dato che succede comunque quando si entra in una funzione significa che le variabili locali sono così economiche che il tentativo di ottimizzarle a qualcos'altro in genere comporta maggiori costi.

L'inserimento nel segmento dati comporta un costo di cache, lo stack di solito si trova nella cache.

Il più grande svantaggio è che perdi proprietà di rientro. Significa che la ricorsione non funzionerà e che non è sicura per i thread.

L'altro grande svantaggio è che lasciare la variabile escape scope è che l'ottimizzatore non può renderlo una variabile di sola registrazione, che non raggiunge mai la RAM per cominciare.

    
risposta data 06.02.2015 - 10:02
fonte
3

Dipende anche dall'architettura. In ARM i primi pochi locali sono memorizzati solo in registri. Finché non chiamate altre funzioni, queste non andranno mai in pila.

Devi andare nella direzione opposta. Piuttosto che usare i globals, dovresti iniziare limitando l'ambito se le variabili il più possibile. Non solo è una buona pratica di codifica, ma aiuta anche il compilatore a ottimizzare al meglio il tuo codice. Dovresti compilare con l'ottimizzazione della velocità massima, quindi guarda il codice assembler generato. Ancora meglio è passare attraverso questo codice se il tuo IDE ti mostrerà l'ASM contemporaneamente al codice C. Sarai sorpreso di ciò che il compilatore può fare. Vedi qui per una buona discussione: link

Solo dopo aver ottenuto un buon codice leggibile che è stato ottimizzato dal compilatore dovresti iniziare a cercare ottimizzazioni personalizzate con codice mano. Normalmente questo è necessario solo per applicazioni speciali in tempo reale con limiti di tempo molto stretti.

    
risposta data 07.02.2015 - 22:32
fonte

Leggi altre domande sui tag