Stavo facendo un test delle prestazioni rapido su un blocco di codicestd :: vector reserve() e push_back() è più veloce di resize() e indice di array, perché?
void ConvertToFloat(const std::vector<short>& audioBlock,
std::vector<float>& out)
{
const float rcpShortMax = 1.0f/(float)SHRT_MAX;
out.resize(audioBlock.size());
for(size_t i = 0; i < audioBlock.size(); i++)
{
out[i] = (float)audioBlock[i] * rcpShortMax;
}
}
ero felice con la velocità fino oltre l'attuazione molto ingenuo originale ci vuole poco più di 1 millisecondo per processare 65.536 campioni audio.
Tuttavia solo per divertimento ho provato la seguente
void ConvertToFloat(const std::vector<short>& audioBlock,
std::vector<float>& out)
{
const float rcpShortMax = 1.0f/(float)SHRT_MAX;
out.reserve(audioBlock.size());
for(size_t i = 0; i < audioBlock.size(); i++)
{
out.push_back((float)audioBlock[i] * rcpShortMax);
}
}
Ora mi aspettavo questo possa fornire le stesse prestazioni come il codice originale. Tuttavia, improvvisamente il ciclo sta prendendo ora 900usec (cioè è 100usec più veloce rispetto all'altra implementazione).
Qualcuno può spiegare perché questo potrebbe fornire prestazioni migliori? resize()
inizializza il vettore appena assegnato dove riserva si alloca ma non costruisce? Questa è l'unica cosa che riesco a pensare.
PS questo è stato testato su un core 2Ghz AMD Turion 64 ML-37.
Un controllo di routine, si sta utilizzando la versione anziché le impostazioni di debug durante la compilazione del codice? – Laserallan
hehehe, sì, stavo usando Release. Era più una domanda su come aiutare il compilatore ad aiutarmi :) – Goz