我正在对一段代码进行快速性能测试
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()
是否初始化了新分配的向量,而reserve
只是分配而不构建?这是我唯一能想到的。
PS,这是在单核2Ghz AMD Turion 64 ML-37上进行测试的。