Ottimizzare C++/Tecniche generali di ottimizzazione: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Riga 3:
== Input/Output ==
 
=== Chiamate di sistema ===
'''Per eseguire operazioni di input/output, invece di usare le primitive del linguaggio, usa direttamente le chiamate al sistema operativo. ==='''
 
Le primitive di I/O dei linguaggi di programmazione sono pensate soprattutto tenendo conto della comodità d’uso invece che le prestazioni, in quanto solitamente per tale codice il collo di bottiglia non è il processore, ma la periferica. Tuttavia, a volte si vuole ottimizzare anche il codice eseguito per effettuare operazioni di I/O. Inoltre, nel caso del C++, la libreria degli stream è particolarmente inefficiente. Le chiamate al sistema operativo garantiscono la massima efficienza, a costo di rinunciare alla portabilità ad altri sistemi operativi, e di dover gestire manualmente la formattazione, la bufferizzazione, e gli errori.
 
=== Formato binario ===
'''Invece di memorizzare i dati su file in modalità testuale, memorizzali in formato binario. ==='''
 
I numeri in formato binario occupano mediamente meno spazio, e quindi richiedono meno tempo per essere letti da disco e scritti su disco, ma, soprattutto, scrivendo e leggendo i dati nello stesso formato che hanno in memoria non c’è bisogno di nessuna conversione da o verso il formato testuale.
 
=== Memory-mapped-file ===
=== '''Eccetto che in una sezione critica di un sistema real-time, se devi accedere a gran parte di un file binario in modo non-sequenziale, invece di accedervi ripetutamente con operazioni di ''seek'', oppure di caricarlo tutto in un buffer dell’applicazione, usa un memory-mapped-file, se il tuo sistema operativo fornisce tale strumento. ==='''
 
Quando si deve accedere a gran parte di un file binario in modo non-sequenziale, ci sono due tecniche alternative standard:
Line 32 ⟶ 35:
Ecco una classe che incapsula le primitive di accesso in sola lettura a un file tramite memory-mapped-file, utilizzabile sia nei sistemi operativi di tipo Posix (come Unix, Linux, e Mac OS X), sia in ambiente Microsoft Windows.
 
==== File '''File "memory_file.hpp":''' ====
 
<source lang=cpp>
Line 72 ⟶ 75:
</source>
 
==== File '''File "memory_file.cpp":''' ====
 
<source lang=cpp>
Line 125 ⟶ 128:
</source>
 
==== File '''File "memory_file_test.cpp":''' ====
 
<source lang=cpp>
Line 133 ⟶ 136:
 
int main() {
// Scrive su console il contenuto del file sorgente.
InputMemoryFile imf("memory_file_test.cpp");
if (imf.data())
Line 138 ⟶ 142:
(const char*)imf.data() + imf.length(),
std::ostream_iterator<char>(std::cout));
else std::cerr << "ErroreImpossibile aprire il file";
}
</source>