(Ho posto una domanda simile su SO ma sfortunatamente potrebbe non essere corretto, quindi lo metto anche qui, ti preghiamo gentilmente di indicare se pensi che sia un duplicato.)
Ho sentito molte parole sulla traslazione semantica (essenzialmente rvalue) introdotto in C ++ 11. In teoria , dovrebbe comportare un notevole miglioramento delle prestazioni dovuto al fatto che evita inutili copie .
Tuttavia, ci sono già stati qualche ottimizzazione per codice legacy durante la compilazione per gestire le copie temporanee inefficienti, come come:
- (denominato) ottimizzazioni del valore di ritorno
- copiatrice elisione
Inoltre, per le strutture dati utilizzate frequentemente, alcune librerie standard C ++ utilizzano ottimizzazioni speciali (ad esempio, ottimizzazione di piccole stringhe per std::string
).
Ancora più importante, anche se alcune parti del codice precedente sono veramente inefficienti, non comportano molta latenza poiché sono
- non viene spesso richiamato
- i computer moderni hanno abbastanza memorie fisiche per loro
Quindi mi chiedo: ci sono esempi del mondo reale che accelerano notevolmente le prestazioni quando si utilizza la moderna sintassi C ++ (C ++ 11/14/17), o si migliorano le prestazioni con un ragionevole percentuale (ad esempio, > 10%) generale ?
Mi aspetto che la risposta possa essere una delle 3 categorie:
#include <vector>
using std::vector;
using std::size_t;
size_t const MAX = NNN; // NNN is specified by -DNNN=xxx option
size_t const NUM = NNN/100;
vector<int> factory(size_t size) {
vector<int> v;
for (size_t i = 0u; i < size; ++i) {
v.push_back(i);
}
return v;
}
// Version 1
/// void doubles(vector<int> & v) {
// Version 2
void doubles(vector<int> && v) {
for (size_t i = 0u; i < v.size(); ++i) {
v[i] = v[i] * 2;
}
}
int main() {
// Version 1
/// vector<int> v = factory(MAX);
/// doubles(v);
// Version 2
doubles(factory(MAX));
}
- Alcuni bug / colli di bottiglia delle prestazioni esistenti in repository del mondo reale che possono essere gestiti bene con il C ++ moderno.
- Alcuni profiling per un pezzo di codice che mostra il miglioramento.
- Iniziare modificando alcuni dei sopra codice banale per aiutarmi a ottenere un esempio che può portare il vantaggio in termini di prestazioni.
E il miglioramento può ancora essere visualizzato con default
(es. -O0
) opzioni di compilazione (quindi -fno-elide-constructors
non è consentito durante la compilazione) di gcc or
clang or
MSVC.
Ho fatto questa domanda perché stavo facendo un sondaggio sull'impatto della semantica sulle prestazioni per i programmi del mondo reale, ma dopo aver provato un codice (banale) e fatto una semplice analisi di base, ho scoperto che semplicemente non riesco a trovare le differenze significative . Quindi, per favore perdonami se lo senti stupido / pedante.