优化C代码,Horner的多项式评估

时间:2015-06-02 19:51:33

标签: c algorithm optimization polynomials

我正在努力学习如何优化代码(我也在学习C),而在我的一本书中,优化Horner的评估多项式方法存在问题。我对如何处理这个问题感到有些迷茫。我并不擅长识别需要优化的东西。

任何有关如何使此功能运行得更快的建议都将受到赞赏。

由于

 double polyh(double a[], double x, int degree) {
        long int i;
        double result = a[degree];
        for (i = degree-1; i >= 0; i--) 
            result = a[i] + x*result;
        return result;
    }

3 个答案:

答案 0 :(得分:3)

您确实需要对代码进行分析,以测试提议的优化是否真的有用。例如,可能会将i声明为long int而不是int会降低计算机上的功能,但另一方面,它可能对您的计算机没有任何影响,但可能会不管怎样,当ilong int时,我没有理由声明degree int,所以改变它可能会赢得&# 39;伤害。 (但还是个人资料!)

根据评估多项式所需的乘法和加法的次数,霍纳的规则被认为是最优的,所以我不太了解你能用它做多少。 可能帮助(个人资料!)的一件事是将测试i>=0更改为i!=0。当然,循环没有运行足够的时间,所以你必须在循环下面添加一行来处理最后的情况。

或者,您可以使用do { ... } while (--i)构造。 (或者它是do { ... } while (i--)?你弄清楚了。)

您可能甚至不需要i,但使用degree可能不会节省可观察的时间并且会使代码更难调试,因此它不值得。

可能帮助的另一件事(我怀疑它,但是个人资料!)正在分解循环中的算术表达式并玩弄顺序,比如

for (...) {
  result *= x;
  result += a[i];
}

可以减少对临时变量/寄存器的需求。尝试一下。

答案 1 :(得分:1)

一些建议:

  1. 您可以使用int代替long int来循环索引。

答案 2 :(得分:0)

几乎可以肯定,问题是邀请你推测B的价值观。如果该向量大多为零,那么通过仅计算a double的值,您将更快(通过减少a[i] * x^i次乘法,这将是大多数计算机上明显的瓶颈) }。反过来,可以通过仔细重复平方来计算a[i] != 0值,保留中间项,这​​样您就不会多次计算相同的局部功率。 See the Wikipedia article如果您从未实施过重复的平方。