【问题标题】:Java Recursion and PerformanceJava 递归和性能
【发布时间】:2012-08-09 03:13:06
【问题描述】:

递归对处理器和内存有很大影响吗? 我的意思是,我的一个线程有一个方法,很可能会调用它自己。假设它每秒可以自调用一次。我的应用程序应该至少运行 24 小时而不会停止,因此它提供了 (60*60*24) 86400 个自调用方法。

它对第二个(主)线程有何影响?

对不起,我的英语不好,没有代码,但我不是在家写的。

【问题讨论】:

  • 一旦你进入那个领域,你必须担心堆栈上有足够的空间。
  • 递归调用是否返回?
  • @Marvo 类似:doSth -> call-self -> return
  • @kittyPL 这并不一定意味着它不会永远持续下去。 “调用自身”步骤应该是有条件的,否则您的函数将无限期地继续调用自身。
  • 它是有条件的,但该条件每天发生一次;>

标签: java recursion


【解决方案1】:

如果在第 86400 次调用之前没有返回语句将结束递归调用字符串,则很可能由于堆栈上的递归调用过多而导致堆栈溢出错误。如果可能,请尝试实施迭代解决方案。

【讨论】:

  • 第一个也是最好的答案 :) 希望你很快赢得更多的声誉 :D
【解决方案2】:

递归调用在内存方面非常低效。
这是因为每次递归调用都会向堆栈添加一个新帧,因此对于 N 调用,您有 O(N) 内存要求。
递归方法通过简单的代码以非常简单的方式(例如遍历树)解决难题。
不利的一面是,如果您不知道自己在做什么,则可能会由于递归调用过多而导致内存不足。
所以如果你知道一个问题可以递归解决,但你需要太多递归尝试迭代实现它(大多数但不是所有递归算法都可以转换为迭代算法)

示例。在我的 Windows 32 位 (4GB) 中,以下内容在 7380 次调用后得到 Exception in thread "main" java.lang.StackOverflowError

public static void recursing( int n ){
        System.out.println(n++);
        recursing(n);
}  
public static void main(String[] args) {
    recursing(1);

}

【讨论】:

  • 堆栈帧非常小(每个大约 8-32 字节),通常会被缓存并在您返回时立即释放。我认为将它们描述为“非常低效”是不公平的——事实上,它们是最有效的可用内存形式之一只要您不耗尽可用的堆栈空间
  • 我将递归调用描述为低效。不是你说的内存
  • 您说“递归调用在内存方面非常低效”。也许值得澄清/说出你的真正意思:-)
【解决方案3】:

我不确定它是否适合您的问题,但听起来调度程序可能很有用,因为您基本上是在说它应该每秒运行一次。您可以尝试使用Quartz Scheduler

您可以创建一个 Job,然后使用简单的触发器或 cron 触发器告诉它永远每秒运行一次。 Documentation 用于石英。

【讨论】:

    【解决方案4】:

    在 Java 中,使用循环通常比使用递归更有效。在某些情况下,递归是最有效的。

    一个处理器每秒可以轻松进行 1000 万次调用或每天数万亿次调用。 86400 不算多,我不会担心。

    假设它每秒可以自调用一次。

    这没有多大意义。使用循环是一种很重要的方法。仅当您打算在完成后返回时才使用递归。

    【讨论】:

    • 好吧,在 7380 次通话中,我在回答的示例中得到了 Exception in thread "main" java.lang.StackOverflowError。除非您在谈论其他事情
    • 恕我直言,超过 20 是相当长的。 :P
    猜你喜欢
    • 1970-01-01
    • 2010-10-17
    • 2017-10-22
    • 2018-10-31
    • 2012-05-20
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多