我正在努力学习如何优化代码(我也在学习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;
}
答案 0 :(得分:3)
您确实需要对代码进行分析,以测试提议的优化是否真的有用。例如,可能会将i
声明为long int
而不是int
会降低计算机上的功能,但另一方面,它可能对您的计算机没有任何影响,但可能会不管怎样,当i
是long int
时,我没有理由声明degree
int
,所以改变它可能会赢得&# 39;伤害。 (但还是个人资料!)
i>=0
更改为i!=0
。当然,循环没有运行足够的时间,所以你必须在循环下面添加一行来处理最后的情况。
或者,您可以使用do { ... } while (--i)
构造。 (或者它是do { ... } while (i--)
?你弄清楚了。)
您可能甚至不需要i
,但使用degree
可能不会节省可观察的时间并且会使代码更难调试,因此它不值得。
可能帮助的另一件事(我怀疑它,但是个人资料!)正在分解循环中的算术表达式并玩弄顺序,比如
for (...) {
result *= x;
result += a[i];
}
可以减少对临时变量/寄存器的需求。尝试一下。
答案 1 :(得分:1)
一些建议:
int
代替long int
来循环索引。答案 2 :(得分:0)
几乎可以肯定,问题是邀请你推测B
的价值观。如果该向量大多为零,那么通过仅计算a
double
的值,您将更快(通过减少a[i] * x^i
次乘法,这将是大多数计算机上明显的瓶颈) }。反过来,可以通过仔细重复平方来计算a[i] != 0
值,保留中间项,这样您就不会多次计算相同的局部功率。 See the Wikipedia article如果您从未实施过重复的平方。