【发布时间】:2009-09-22 16:57:52
【问题描述】:
我正在对一段代码进行快速性能测试
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 上测试的。
【问题讨论】:
-
例行检查,您在编译代码时使用的是发布而不是调试设置?
-
呵呵呵呵,是的,我使用的是 Release。更多的是关于帮助编译器帮助我的问题:)
标签: c++ optimization stl vector