que estaba haciendo una prueba de rendimiento rápido en un bloque de códigostd :: vector reserve() y push_back() es más rápido que resize() y el índice de matriz, ¿por qué?
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;
}
}
que estaba contento con la velocidad a lo largo de la implementación original de muy ingenuo que se necesita un poco más de 1 ms para procesar 65.536 muestras de audio.
Sin embargo sólo por diversión He intentado lo siguiente
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);
}
}
Ahora que esperaba totalmente esto para dar exactamente el mismo rendimiento que el código original. Sin embargo, de repente, el ciclo ahora toma 900usec (es decir, es 100usec más rápido que la otra implementación).
¿Alguien puede explicar por qué esto daría un mejor rendimiento? ¿resize()
inicializa el vector recientemente asignado donde reserva solo asigna pero no construye? Esto es lo único que se me ocurre.
PS esto fue probado en un solo núcleo 2Ghz AMD Turion 64 ML-37.
Una comprobación de rutina, ¿está utilizando la versión en lugar de la configuración de depuración al compilar el código? – Laserallan
jejeje, sí, estaba usando Release. Era más una pregunta sobre ayudar al compilador a ayudarme :) – Goz