Ottimizzare C++/Ciclo di vita dell’ottimizzazione: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m Bot: Aggiungo: en:Optimizing C++/Optimization life cycle |
Riportate modifiche da en.wikibooks |
||
Riga 1:
{{Ottimizzare C++}}
# '''[[w:Progettazione (ingegneria del software)|Progettazione]]''' (''design''). Dapprima, si progettano gli algoritmi e le strutture dati in modo tale che abbiano senso per la logica applicativa, e che siano ragionevolmente efficienti, ma senza occuparsi di ottimizzarle. Dove si deve definire una struttura dati di ampio utilizzo e per la quale non è ovvio quale sia l'implementazione ottimale (per esempio, non si sa scegliere tra un array e una lista collegata), si definisce una [[w:Tipo di dato astratto|struttura astratta]],
# '''Codifica''' (''coding''). Poi si scrive il codice che implementa gli algoritmi progettati, seguendo linee-guida che permettano di evitare alcune operazioni
# '''[[w:Collaudo del software|Collaudo funzionale]]''' (''functional testing''). Poi si collauda il software prodotto, in modo da aumentare la probabilità che non abbia difetti rilevanti.
# '''[[w:Ottimizzazione (informatica)|Ottimizzazione]]''' (''tuning''). Dopo aver completato lo sviluppo di un'applicazione o libreria funzionante correttamente, si passa alla fase di ottimizzazione, costituita dalle seguenti sotto-fasi:
## '''Collaudo prestazionale''' (''performance testing''). Si valuta quali comandi hanno prestazioni inadeguate, cioè
## [[w:en:Performance analysis|'''Analisi delle prestazioni''']]. Per ogni comando avente prestazioni inadeguate, si determina, usando un profiler, quali porzioni di codice costituiscono i cosiddetti [[w:Bottleneck (ingegneria)|'''colli di bottiglia''']] per tale comando
## '''Ottimizzazione algoritmica'''. Nei colli di bottiglia, si applicano tecniche di ottimizzazione sostanzialmente indipendenti dal linguaggio di programmazione, e totalmente indipendenti dalla piattaforma. Sono le tecniche che si trovano nei testi di teoria degli algoritmi. In pratica, si cerca di ridurre il numero di istruzioni eseguite, e in particolare il numero delle chiamate a routine costose, oppure a trasformare le chiamate costose in chiamate equivalenti ma meno costose. Per esempio, si sceglie di implementare l'algoritmo di ordinamento [[w:Quick_sort|''quick sort'']] invece dell'algoritmo [[w:Selection_sort|''selection sort'']]. Se questa ottimizzazione rende il programma sufficientemente veloce, si termina l'ottimizzazione.
## '''Ottimizzazione indipendente dalla piattaforma'''. Nei colli di bottiglia, si adottano tecniche di ottimizzazione dipendenti dal linguaggio di programmazione e dalla sua libreria standard, ma indipendenti sia dalla piattaforma software che dalla piattaforma hardware. Per esempio, si usano operazioni intere invece di operazioni a virgola mobile, o si sceglie il tipo di contenitore più appropriato tra quelli disponibili nella libreria standard. Se questo rende il programma sufficientemente veloce, si termina l'ottimizzazione.
## '''Ottimizzazione dipendente dalla piattaforma software'''. Nei colli di bottiglia, si adottano tecniche di ottimizzazione dipendenti sia dal linguaggio di programmazione che dalla piattaforma software, ma indipendenti dalla piattaforma hardware. Per esempio,
## '''Ottimizzazione dipendente dalla piattaforma hardware'''. Nei colli di bottiglia si adottano tecniche di ottimizzazione dipendenti dalla piattaforma hardware, cioè o istruzioni macchina che esistono solo su una particolare famiglia di processori
Questo
* '''Principio delle rese calanti'''. Le ottimizzazioni che danno grandi risultati con poco sforzo devono essere applicate per prime, in quanto così si minimizza il tempo necessario a raggiungere gli obiettivi prestazionali.
Riga 24:
Inoltre, un collaudo parziale delle prestazioni deve essere eseguito dopo ogni tentativo di ottimizzazione, per verificare se il tentativo risulta utile, e, in caso affermativo, per verificare se risulta risolutivo, cioè se sono necessarie altre ottimizzazioni.
Infine, dopo aver completato la fase di ottimizzazione, si devono ripetere sia il collaudo funzionale che il collaudo prestazionale completo, per garantire che la nuova versione ottimizzata del software non sia peggiorata né per la correttezza né per le prestazioni complessive.
Questo testo approfondisce solo tre
*
* Alcune tecniche generali relative
*
== Notazioni terminologiche ==
In particolare, un dato associato a una variabile di un tipo fondamentale (come ''bool'', ''double'', ''unsigned long'', o un puntatore) è un oggetto, così come lo è la struttura dati associata a un'istanza di una classe.
A ogni variabile è associato un oggetto, la cui lunghezza si ottiene con l'operatore del C++ <code>sizeof</code>, ma un oggetto potrebbe non avere nessuna variabile associata a esso, oppure più variabili associate a esso.
Per esempio, un puntatore è un oggetto, ma può puntare a un altro oggetto
D'altra parte, nel seguente codice, sia la variabile <code>a</code> che la variabile <code>b</code> sono associate allo stesso oggetto:
|