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