我的代碼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