我的代码std :: vector reserve()和push_back()比resize()和数组索引快,为什么?
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上进行了测试。
例行检查时,编译代码时使用的是释放而不是调试设置? – Laserallan 2009-09-22 17:15:25
hehehe,是的,我正在使用发布。这是关于帮助编译器帮助我的更多问题:) – Goz 2009-09-22 18:25:52