[英]Optimizing C code, Horner's polynomial evaluation
我正在尝试学习如何优化代码(我也在学习C),并且在我的一本书中,存在一个优化霍纳方法用于评估多项式的问题。 我对如何解决这个问题有些迷惑。 我不太擅长识别需要优化的内容。
任何有关如何使此功能运行更快的建议,将不胜感激。
谢谢
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;
}
您确实需要分析您的代码,以测试建议的优化是否真正有用。 例如,在某些情况下,将i
声明为long int
而不是int
会减慢计算机的功能,但另一方面,这可能对您的计算机没有任何影响,但可能对其他计算机有所影响,依此类推。当degree
是一个int
,没有理由将i
声明为long int
,因此更改它可能不会受到伤害。 (但仍是个人资料!)
霍纳法则在评估多项式所需的乘法和加法数方面被认为是最佳的,因此我认为您无法对此做很多事情。 可能有帮助(配置文件!)的一件事是将测试i>=0
更改为i!=0
。 当然,循环不会运行足够的时间,因此您必须在循环下方添加一行以处理最后的情况。
另外,您可以使用do { ... } while (--i)
构造。 (或者是do { ... } while (i--)
吗?您知道了。)
您甚至可能不需要i
,但是使用degree
可能不会节省可观察的时间,并使代码更难调试,因此不值得。
可能有帮助的另一件事(我对此表示怀疑,但配置文件!)是破坏循环内的算术表达式并按顺序进行操作,例如
for (...) {
result *= x;
result += a[i];
}
这可以减少对临时变量/寄存器的需求。 试试看。
一些建议:
int
代替long int
来循环索引。 几乎可以肯定,问题是邀请您对a
的值进行猜测。 如果该向量大部分为零,那么通过仅计算a[i] * x^i
的a[i] * x^i
值,您会更快(通过执行较少的double
乘法,这将是大多数机器上的明显瓶颈) a[i] != 0
。 依次, x^i
值可以通过仔细地重复平方来计算,保留中间项,这样您就永远不会多次计算相同的分幂。 如果您从未实现过重复平方, 请参阅Wikipedia文章 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.