【问题标题】:Java Program TuningJava 程序调优
【发布时间】:2019-09-18 12:07:24
【问题描述】:

我很想听听其他人对如何调整以下代码以提高性能的看法。我的想法是 run 方法可以递归调用 20 次,而不是简单的迭代循环:

class Looper extends Thread {

    @Override
    public void run() {
        for(int i=0; i<10; i++) {
            heavyLogicGoesHere();
        }
    }

    void heavyLogicGoesHere() {
        System.out.println((new java.util.Random().nextInt()));
    }
}

public class Main {
    public static void main(String[] args) {
        Looper worker1 = new Looper();
        worker1.run();

        Looper worker2 = new Looper();
        worker2.run();
    }
}

【问题讨论】:

  • 什么?为什么递归应该比迭代更好?这通常是 FAAAAR 过于宽泛,性能改进很大程度上取决于正在完成的任务,没有一般的答案。如果有的话,您可以通过谷歌搜索轻松找到它。
  • 因为run() 被直接调用(而不是调用start()),所以扩展线程没有意义。所以workers 顺序运行,而不是同时运行。举个简单的例子,顺序运行可能实际上更快。

标签: java algorithm performance


【解决方案1】:

如果heavyLogicGoesHere可以独立工作,为什么不创建一个线程池并同时处理它。 我的建议是:

class Looper extends Thread {

 @Override
 public void run() {
   heavyLogicGoesHere();
 }

 void heavyLogicGoesHere() {
    System.out.println((new java.util.Random().nextInt()));
 }
}

你的主要功能可以实现:

 ExecutorService executor = Executors.newFixedThreadPool(5);
 for (int i = 0; i < 10; i++) {
    Looper worker = new Looper("" + i);
    executor.execute(worker);
 }
 executor.shutdown();
 while (!executor.isTerminated()) {
   //Thread sleep 
 }
 System.out.println("Finished all threads");

【讨论】:

    【解决方案2】:

    由于性能热点位于heavyLogicGoesHere(),因此执行 10 次调用的方式没有任何区别。 for 循环是最易读的,因此没有理由(当然不是性能)在这里尝试引入递归。

    你应该调整的是heavyLogicGoesHere(),当然假设里面有很重的逻辑,而不是像例子中那样打印一个随机的int。毕竟,如果你每月花 200 美元买冰淇淋,每月花 20 美元买卫生纸,你就不会开始“调整”你的卫生纸使用。

    您还扩展了Thread(而不是实现Runnable)并调用run() 而不是start(),因此代码错误的方式不止一种。我建议您在真正需要之前忘记性能优化。首先你需要专注于编写正确的代码。

    【讨论】:

      猜你喜欢
      • 2016-10-16
      • 2010-12-20
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      相关资源
      最近更新 更多