Sto provando a creare un insieme di parole univoche da un elenco di voci, ognuna delle quali ha un vettore di stringhe.Efficienza della funzione di copia STL
Così ho fatto una funzione chiamata Inserisci, che viene chiamata per ciascuna delle voci come queste:
for(auto & e : _Entries)
_Dictionary.Insert(begin(e.getNameWords()), end(e.getNameWords()));
Il _Dictionary classe ha al suo interno un set (il contenitore STL) e ho scritto la funzione di inserimento nel modo seguente :
template< typename InputIterator >
void Insert(InputIterator first, InputIterator last)
{
for(auto it = first ; it != last ; ++it)
_AllWords.insert(*it);
}
Nel mio caso, chiamando inserimento per tutte le voci _Entries preso una media di 570 millisecondi.
poi ho pensato che avrei dovuto utilizzare le funzioni che lo STL ha già a fare la stessa cosa che il ciclo for in Inserire lo fa, così ho cambiato la funzione Inserire la seguente:
template< typename InputIterator >
void Insert(InputIterator first, InputIterator last)
{
copy(first, last, inserter(_AllWords, begin(_AllWords)));
}
ero aspettandosi questo per
- essere più corretto, e
- essere almeno altrettanto veloce, se non di più
(guidato dalla filosofia di lasciare che STL faccia quanto più possibile per te). Tuttavia, sono stato sorpreso di notare che questa implementazione ha effettivamente richiesto più tempo; non molto di più, ma un costante di 200 millisecondi in più rispetto alla precedente implementazione basata sul ciclo.
So che questa è una differenza di velocità essenzialmente insignificante, ma sono ancora sorpreso.
Quindi la mia domanda è: perché la mia implementazione è più veloce?
Nota: lo sto compilando con la versione 3.5.2 di clang con la libreria standard libC++ e con il flag -O3, in Ubuntu 14.04.
Sarebbe utile fornire un [Breve, autonomo, corretto (compilabile), esempio] (http://sscce.org/) per noi :) – melak47
Come hai effettivamente misurato? –
Si noti che gli identificatori che iniziano con un carattere di sottolineatura, seguito da una lettera maiuscola, sono riservati per l'implementazione. – chris