Questo è stato già toccato in Why C++ lambda is slower than ordinary function when called multiple times? e C++0x Lambda overhead Ma penso che il mio esempio sia un po 'diverso dalla discussione nel primo e contraddice il risultato nel secondo.Comprendere il sovraccarico delle funzioni lambda in C++ 11
Nella ricerca di un collo di bottiglia nel mio codice, ho trovato una funzione modello occulto che elabora una lista di argomenti variadici con una determinata funzione del processore, come la copia del valore in un buffer.
template <typename T>
void ProcessArguments(std::function<void(const T &)> process)
{}
template <typename T, typename HEAD, typename ... TAIL>
void ProcessArguments(std::function<void(const T &)> process, const HEAD &head, const TAIL &... tail)
{
process(head);
ProcessArguments(process, tail...);
}
ho confrontato il tempo di esecuzione di un programma che utilizza questo codice insieme con una funzione lambda così come una funzione globale che copia gli argomenti in un buffer globale utilizzando un puntatore in movimento:
int buffer[10];
int main(int argc, char **argv)
{
int *p = buffer;
for (unsigned long int i = 0; i < 10E6; ++i)
{
p = buffer;
ProcessArguments<int>([&p](const int &v) { *p++ = v; }, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
}
}
compilato con g ++ 4.6 e -O3 misurando con il tempo utensile impiega più di 6 secondi sulla mia macchina mentre
int buffer[10];
int *p = buffer;
void CopyIntoBuffer(const int &value)
{
*p++ = value;
}
int main(int argc, char **argv)
{
int *p = buffer;
for (unsigned long int i = 0; i < 10E6; ++i)
{
p = buffer;
ProcessArguments<int>(CopyIntoBuffer, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
}
return 0;
}
richiede circa 1,4 secondi.
Non capisco cosa succede dietro le quinte che spiega il tempo trascorso e mi chiedo se posso cambiare qualcosa per utilizzare le funzioni lambda senza pagare con il runtime.
Così è quello globale davvero più lento? Dici che è 6s contro 1,4 per quello basato su lambda, ma poi l'ultima frase non ha senso. – dasblinkenlight
Durante l'analisi, hai sbirciato in un elenco di assiemi generato? – WhozCraig
Passare 'process' da' const' riferimento, come questo, 'void ProcessArguments (const std :: function & process)', fare qualche differenza? –
dasblinkenlight