浮点矢量元素比较的优化

时间:2015-07-23 07:46:25

标签: c++ optimization vector floating-point comparison

分析以下代码(已更新):

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仪器进行性能分析。

1 个答案:

答案 0 :(得分:0)

最明显的改进之一是将浮动与浮动进行比较,并将双倍加倍。 0.001double0.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;