分析以下代码(已更新):
struct myStruct {
float a;
float b;
};
int main()
{
std::vector<myStruct> myVector;
float tmp,tmp2,absVal;
for(int i=0;i<100000;i++)
{
tmp2 = (i%10)/100.f;
for(myStruct &s : boost::adaptors::reverse(myVector))
{
tmp = s.a;
absVal = fabs(tmp-tmp2);
if(absVal<0.0001f)
{
s.b = 1.5f;
}
}
myStruct s;
s.a = tmp2;
myVector.push_back(s);
}
}
我可以看到,它花费50%的时间用于比较absVal&lt; 0.0001。 我可以减少用于比较的时间吗?
使用-O2标志编译代码,clang-602.0.53。使用带有Time Profiler的Apple仪器进行性能分析。
答案 0 :(得分:0)
最明显的改进之一是将浮动与浮动进行比较,并将双倍加倍。 0.001
是double
,0.001f
是浮点数。
这是一个明显的改进,编译器可能已经默默地为你做了这件事。但分析结果表明它没有。
你到处都有类似的问题。 / (static_cast <float> (RAND_MAX/2.))
看起来很糟糕:将RAND_MAX转换为double,然后除以2.0并将结果转换回浮点,浮点除法,并且所有都是常量。
或者:
static const float scale = 2.f/RAND_MAX;
(float i=0.f;i<1000.f;i+=0.01f)
{
// ...
s.b = rand() * scale;