Я проводил быстрый тест производительности на блоке кода
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;
}
}
Я был доволен ускорением по сравнению с оригинальной очень наивной реализацией, для обработки 65536 аудиосэмплов требуется чуть более 1 мс.
Однако, просто для удовольствия, я попробовал следующее
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 );
}
}
Теперь я полностью ожидал, что это даст точно такую же производительность, что и исходный код. Однако неожиданно цикл теперь занимает 900 мкс (то есть на 100 мкс быстрее, чем в другой реализации).
Может кто-нибудь объяснить, почему это даст лучшую производительность? resize()
инициализирует недавно выделенный вектор, где резерв только распределяет, но не создает? Это единственное, о чем я могу думать.
PS это было проверено на одноядерном 2Ghz AMD Turion 64 ML-37.