有什么方法可以加快这个递归函数的执行速度并保持其递归性吗?
var printDecreased = function(z) {
console.log(z);
if (z > 0) {
printDecreased(z-1);
}
};
printDecreased(50);
由于这有一个递归调用,我认为没有很多方法可以加速它
最佳答案
您可以通过避免 if 语句来稍微提高速度,如下所示:
var printDecreased = function(z) {
console.log(z);
(z > 0 && printDecreased(z-1));
};
printDecreased(50);
但是增幅非常小(大约5-10%)
这是如何运作的?
这里的关键词是分支预测。我不会详细介绍分支预测,因为这不是问题所在。底线是,分支会消耗相当多的 CPU 时间,这意味着每个 if 都非常昂贵,如果您想提高频繁使用的线路的速度,请尽力忽略所有分支.
最简单的方法是用三元运算符替换每侧仅包含一个语句的 if/else 结构,以及仅包含一个语句的 if 结构。由 && 或 || 运算符计算的总计。一般来说,它们比 if 或 if/else 快得多。这可以应用于几乎所有支持这些结构的编程语言。
示例
if (x==y) {
callA();
} else {
callB();
}
可以替换为
(x==y ? callA() : callB());
和
if (x==y) {
callA();
}
可以替换为
(x==y && callA());
或
(x!=y || callA());
这些选项为编译器提供了如何优化的更好线索,因此它可以优化分支预测。
其他可能的优化 由于给定的限制,该示例很难比到目前为止更好地优化。由于这是一个非常简单的函数,因此函数调用开销占据了执行时间的很大一部分。如果您可以用循环替换递归(这在给定的示例中很容易完成),一般来说,您也可以大大加快该过程。删除递归可以加快大多数编程语言中的函数速度,因为调用函数通常会花费大量 CPU 时间。
关于javascript - 加速 JavaScript 中的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30574967/