Ottimizzare C++/Ottimizzazione del codice C++/Supporto run-time: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
RamaccoloBot (discussione | contributi)
Riportate modifiche da en.wikibooks
 
Riga 2:
 
Le routine del supporto run-time del linguaggio C++ hanno ovviamente un costo significativo, in quanto altrimenti tali funzionalità sarebbero state espanse ''inline''.
 
QuiIn questa sezione si presentano tecniche per evitare costrutti che comportano la chiamata implicita di costose routine del supporto run-time.
 
=== L'operatore <code>typeid</code> ===
Line 14 ⟶ 15:
'''Invece dell'operatore <code>dynamic_cast</code>, usa l'operatore <code>typeid</code>, o, ancora meglio, una funzione <code>virtual</code>.'''
 
Tale operatore può richiedere un tempo notevolmente superiore a quello richiesto da una semplice chiamata a funzione, e maggiore ancheperfino adi quello richiesto dall’operatoredall'operatore <code>typeid</code>.
 
=== La specifica di eccezioni vuota ===
Line 26 ⟶ 27:
'''Sposta prima dei colli di bottiglia le istruzioni <code>try</code>, e dopo i colli di bottiglia le corrispondenti istruzioni <code>catch</code>.'''
 
In altre parole, estrai dai colli di bottiglia i blocchi <code>try/catch</code>.
L’esecuzione di un blocco <code>try/catch</code> talvolta ha costo zero, ma altre volte comporta un rallentamento. Evita di eseguire tale blocco all’interno dei colli di bottiglia.
 
L’esecuzioneL'esecuzione di un blocco <code>try/catch</code> talvolta ha costo zero, ma altre volte comporta un rallentamento. Evita di eseguire tale blocco all’internoall'interno dei colli di bottiglia.
=== Operazioni a virgola mobile ===
 
=== Operazioni a virgola mobile o intere ===
'''Se il processore target non contiene un'unità a virgola mobile, sostituisci funzioni, costanti e variabili a virgola mobile con le corrispondenti funzioni, costanti e variabili intere; mentre se contiene un'unità a virgola mobile a precisione solamente singola, sostituisci funzioni, costanti e variabili di tipo <code>double</code> con le corrispondenti di tipo <code>float</code>.'''
 
'''Se il processore target non contiene un'unità a virgola mobile, sostituisci le funzioni, costanti e variabili a virgola mobile con le corrispondenti funzioni, costanti e variabili intere; mentre se contiene un'unità a virgola mobile a precisione solamente singola, sostituisci funzioni, costanti e variabili di tipo <code>double</code> con le corrispondenti di tipo <code>float</code>.'''
Gli odierni processori per sistemi desktop e server contengono hardware dedicato all'aritmetica a virgola mobile, sia a precisione singola che doppia, per cui tali operazioni, eccettuate somme e sottrazioni, che sono un po' più lente, sono pressoché altrettanto veloci quanto quelle su numeri interi.
 
Gli odierni processori per sistemi desktop e server contengono hardware dedicato all'aritmetica a virgola mobile, sia a precisione singola che doppia, per cui tali operazioni, eccettuate somme e sottrazioni, che sono un po' più lente, sono pressoché altrettanto veloci quanto quelle su numeri interi.
 
Alcuni processori dedicati per sistemi embedded, invece, non contengono hardware dedicato all'aritmetica a virgola mobile, o contengono hardware in grado di gestire solo la precisione singola.
Pertanto, in tali sistemi, le operazioni non disponibili in hardware vengono solamente emulate con lentissime funzioni di libreria. In tal caso, risulta molto più veloce utilizzare l'aritmetica intera, oppure, se disponibile in hardware, l'aritmetica a precisione singola.
 
Per gestire numeri decimali usando l'aritmetica a intera si devedevono usare gli interi intendendoli moltiplicati per un fattore di scala.
OgniA tale scopo, ogni numero viene moltiplicato per tale fattore in fase di input e viene diviso per lo stesso fattore in fase di output, o viceversa.
 
=== ConversioniConversione da numero a stringa ===
 
'''Usa funzioni ottimizzate per convertire numeri in stringa.'''
 
Le funzioni standard di conversione da numero intero a stringa e da numero a virgola mobile a stringa sono poco efficienti.
Per svolgere velocemente tali operazioni, usa funzioni ottimizzate non-standard, eventualmente scritte da te.
 
=== Uso delle funzioni di <code>cstdio</code> ===
 
'''Per eseguire operazioni di input/output, invece di usare gli stream del C++, usa le vecchie funzioni del C, dichiarate nel file di intestazione <code>cstdio</code>.'''
 
Le primitive di I/O del C++ sono state progettate principalmente per effettuare il controllo statico dei tipi (o ''type safety'') e per consentire la personalizzazione per le proprie classi invece che per le prestazioni, e molte loro implementazioni risultano essere piuttosto inefficienti.
In particolare, le funzioni di I/O del linguaggio C <code>fread</code> e <code>fwrite</code> sono più efficienti delle funzioni membro della classe <code>fstream</code> <code>read</code> e <code>write</code>.
 
[[Categoria:Ottimizzare C++|Supporto run-time]]