javascript - 加速 JavaScript 中的递归函数

标签 javascript recursion

有什么方法可以加快这个递归函数的执行速度并保持其递归性吗?

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 结构。由 &&|| 运算符计算的总计。一般来说,它们比 ifif/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/

相关文章:

javascript - 如何在 JS 确认消息中添加新行以在单击链接时显示?

list - 递归地将列表的第一个元素附加到列表的其余部分

c# - 递归遍历目录树并列出文件名

javascript - 在 AngularJS 单元测试中断言递归 $timeout 中的 http 调用次数

sql - 递归查询设计 - Oracle SQL

javascript - 我如何使用 chrome.tabs.onUpdated.addListener?

javascript - addClass ('open' ) 在 jquery 中不起作用

javascript - 一个模态如何重新打开另一个模态? ( Angular 4+)

javascript - 如何使用 jquery/javascript 在 div 中获取选择

c - 我该如何解决以下代码?