Di quali argomenti di rendimento dovrei essere a conoscenza? [chiuso]

4

Quando si codificano porzioni di codice critiche per le prestazioni (non necessariamente grandi, ma codice che viene eseguito molto), quali argomenti dovrei essere a conoscenza / prendere in considerazione.

Ho già una certa familiarità con il caching, l'aliasing, la ramificazione, il costo delle operazioni aritmetiche, lo srotolamento del loop (e suppongo che alcuni altri non vengano in mente).

Che altro dovrei sapere? (non necessariamente alla ricerca di dettagli, solo concetti che posso cercare da soli)

    
posta Luchian Grigore 22.01.2013 - 10:16
fonte

4 risposte

1

I miei 2 centesimi:

Riguarda quanto efficacemente gestisci le tue risorse e utilizzi l'hardware disponibile.

Generalmente, sarai limitato nella quantità di memoria che hai (RAM), ma c'è una quantità di velocità di elaborazione disponibile di quella che utilizziamo.

Mentre l'utilizzo efficace della memoria dipende in gran parte dalle tecniche e dagli algoritmi ( memorizzazione nella cache, aliasing, ramificazione, costo delle operazioni aritmetiche, srotolamento del ciclo (e penso ad altri che non vengono in mente) ). Nelle piattaforme in cui viene gestita la memoria (Java, .NET), l'esecuzione frequente del GC ha un impatto negativo sulle prestazioni. Se c'è meno memoria libera, GC continua a girare frequentemente cercando di liberare memoria. Quindi, tieni una scheda su come i tuoi oggetti vengono creati e distrutti. Nelle lingue in cui la memoria è gestita in modo esplicito (C, C ++), con la regola empirica, si mantiene sempre un controllo (si libera la memoria non appena si finisce l'attività). Quindi, in entrambi i casi, avere abbastanza memoria libera garantirà un minor numero di pedaggi sulle prestazioni.

La concorrenza è il modo di utilizzare la CPU in modo efficace. Invece di bloccare e mantenere la CPU inattiva, la concorrenza consente di utilizzare la CPU in modo efficace su attività che potrebbero essere eseguite in parallelo. Mentre la concorrenza è un gradino sopra i programmi a thread singolo, l'avvento delle macchine multi-core e la sua ubiquità ci impongono di fare un ulteriore passo avanti (vedi qui ) per utilizzare in modo efficace tutti i core. L'utilizzo della CPU migliora in modo efficace le prestazioni.

    
risposta data 22.01.2013 - 11:06
fonte
1

Penso che quando si tratta di prestazioni, sia essenziale conoscere le strategie e i metodi di ottimizzazione del compilatore. Ciò che ti aiuta è che quando capisci che tipo di ottimizzazioni il compilatore è in grado di fare e in quali circostanze, puoi effettivamente scaricare l'ottimizzazione delle prestazioni al compilatore (come dovresti comunque, se possibile) assicurandoti di dare è la massima opportunità possibile per ottimizzare il codice.

Naturalmente conoscere gli strumenti che ti aiutano con la profilazione e il benchmarking del tuo codice / implementazione è essenziale. Infatti, non ha senso ottimizzarlo a meno che non si possa misurare il beneficio. Alla fine questo si riduce alla possibilità di ragionare tra più implementazioni e che e perché la performance differisce al livello più basso possibile - senza questa comprensione è molto difficile venire con valido opportunità di ottimizzazione su cui ragionare.

Come linea di fondo, direi che conoscere il compilatore e ottimizzare le capacità e le opportunità, oltre a familiarizzare con gli strumenti per misurare i vantaggi e individuare i colli di bottiglia e comprendere le capacità della CPU e set di istruzioni sono le tre cose più importanti per qualsiasi programmatore quando si tratta di scrivere codice nativo performante. Sì, questo è molto generale, ma in quanto tale è anche molto applicabile. Alla fine tutto si riduce a questo.

    
risposta data 22.01.2013 - 11:05
fonte
1

Prima di tutto, la maggior parte dei problemi di prestazioni finisce per essere causata dall'uso, possibilmente per errore, di algoritmi con complessità sfavorevole. Quindi, prima di tutto, continua a cercare tutto ciò che viene fatto più volte del previsto.

Quando li hai svuotati e sei davvero alle micro-ottimizzazioni come ultima possibilità, la regolazione per l'utilizzo della memoria cache può fare la differenza. Può essere profilato usando valgrind cacheprov pelle. I suggerimenti generali sono di mantenere insieme il piccolo insieme di oggetti di lavoro (memoria frequentemente utilizzata), e possibilmente utilizzare l'allocatore che può eseguire il coloring della cache.

Anche se la ricerca è andata agli allocatori, le librerie standard spesso forniscono allocatori di memoria piuttosto scadenti, quindi prendi in considerazione l'utilizzo di uno personalizzato ( umem , tcmalloc , ...) e / o impiegano pool di memoria per strutture di dati comuni ( i miglioramenti alle specifiche degli allocatori in C ++ 11 lo rendono molto più semplice e più utilizzabile.

    
risposta data 22.01.2013 - 10:38
fonte
0

se hai bisogno di lavorare con i numeri e non sono necessari risultati accurati al 100%, non essere timido per provare algoritmi meno precisi

questo è molto evidente nello sviluppo del gioco, in cui i risultati sullo schermo non devono essere esatti, devono solo essere abbastanza vicini da sembrare giusti, è più importante che i calcoli avvengano velocemente ; guarda la radice quadrata inversa rapida per un esempio classico

    
risposta data 22.01.2013 - 11:08
fonte

Leggi altre domande sui tag