inline void add(const DataStruct& rhs) {
using namespace boost::assign;
vec.reserve(vec.size() + 3);
vec += rhs.a, rhs.b, rhs.c;
}
La funzione di cui sopra è stato eseguito per circa 17000 volte e ha eseguito (per quanto posso vedere. C'era qualche trasformazione coinvolti) circa 2 magnitudini peggio con la chiamata per vector :: reserve.std :: vector :: penalizzazione delle prestazioni di riserva
Ho sempre avuto l'impressione che la riserva possa accelerare push_back anche per valori piccoli, ma questo non sembra vero e non riesco a trovare alcun ovvio motivo per cui non dovrebbe essere così. Si riserva di impedire la definizione della funzione? La chiamata a size() è troppo costosa? Questo dipende dalla piattaforma? Proverò a codificare un piccolo benchmark per confermarlo in un ambiente pulito.
Compiler: gcc (GCC) 4.4.2
con -g -O2
Hai provato riservare lo spazio per 17000 * 3 ingressi? Potrebbe esserci un sovraccarico con la chiamata di funzione extra, che potrebbe spiegare la differenza. – int3
@ splicer: il numero era dovuto ai testdata. Il numero effettivo di chiamate è variabile. – pmr
il mio punto era che quello che stai facendo è efficace solo con numeri più grandi. La risposta di James Schek ti dà modo di farlo con un numero variabile di chiamate, purché tu conosca il totale con cui iniziare. altrimenti è meglio lasciare che l'implementazione predefinita gestisca il problema per te. – int3