【问题标题】:How to optimize this code to make it faster如何优化此代码以使其更快
【发布时间】:2020-05-29 21:42:15
【问题描述】:

我是一个真正的 Java 新手高中生,我们目前正在优化一个项目,但我现在陷入困境。我想我已经尽我所能。 以下是我的 3 节课。 PS,这些代码打印出在while循环中花费的时间,我试图在我的计算机上将它降低到不到1秒。它目前在 1.49 和 1.38 之间运行。

主要:

public class code {
    public static void main(String[] args) {
        int numRows = 30;
        int numCols = 30;
        int start = 31;
        int exit = 868;
        int numKittens = 30_000;
        KittenBox box = new KittenBox(numRows, numCols, start, exit, 
                  numKittens);
        double a = 10;
        box.play();
    }
}

kitten.java:

导入 java.util.SplittableRandom;

public class Kitten {

private int rows;
private int columns;
public int square;
private SplittableRandom a;

public Kitten(int rows, int columns, int square) {
    this.rows = rows;
    this.columns = columns;
    this.square = square;
    a = new SplittableRandom();
}

public int move() {
    int i = a.nextInt(1, 5);
    return (i == 1 && (!(this.square < columns))) ? 
            this.square -= rows : ((i == 2 && (!(this.square >= columns * 
            (rows - 1)))) ? this.square += rows : ((i == 3 && (!(this.square
            % rows == 0))) ? this.square -= 1 : ((!(this.square % rows == 
            rows - 1)) ? this.square += 1 : this.square)));
}

}

kittenbox.java:

public class KittenBox {

    private ArrayList<Kitten> kitten;
    private int numRows;
    private int numCols;
    private int start;
    private int exit;
    private int numKittens;

    public KittenBox(int numRows, int numCols, int start, int exit, int numKittens) {
        this.numRows = numRows;
        this.numCols = numCols;
        this.start = start;
        this.exit = exit;
        this.numKittens = numKittens;
        kitten = new ArrayList<>();

    }
    public void play() {
        for (int i = 0; i < numKittens; i++) {
            kitten.add(new Kitten(numRows, numCols, start));
        }
        long startTime = System.nanoTime();
        while (!kitten.isEmpty()) {
            for (int i = 0; i < kitten.size(); i++) {
                kitten.get(i).move();
                if (kitten.get(i).square == exit) {
                    kitten.remove(i);
                }
            }
        }
        long endTime = System.nanoTime();
        System.out.format("Kittens took %f seconds to escape.\n",
                (endTime - startTime) / 1000000000.0);
    }
}

但我仍然无法将我的代码加速到基准测试。有没有更快的方法?

非常感谢。

【问题讨论】:

  • 你确定你的代码中没有其他东西会减慢它的速度吗?像这样的库方法通常都得到了很好的优化。可能会提供更多代码,因为您将注意力集中在错误的行上。
  • 您是否分析过您的应用程序以找到瓶颈,或者只是您猜测这条特定线路导致您的应用程序错过了基准测试(哪一个?)?

标签: java performance optimization cpu-speed


【解决方案1】:

您可以选择:

Math.random() // 它有可靠的efficiency。

您可以参考以下程序:

        int max = 5; 
        int min = 1; 
        int range = max - min + 1; 

        // generate random numbers within 1 to 10 
        for (int i = 0; i < max; i++) { 
            int rand = (int)(Math.random() * range) + min; 

            // Output is different everytime this code is executed 
            System.out.println(rand); 
        } 

【讨论】:

    【解决方案2】:

    不确定这有多快,但你可以试试这个

    int randomNumber = (int)(Math.random() * range_size + starting_num);
    int one_to_four = (int)(Math.random() * 4 + 1);
    
    【解决方案3】:

    您的问题很可能是您调用 move() 的这个可怕的函数并没有按照您认为的方式工作,因此它导致小猫到达“退出”的频率比您想象的要低得多会的。

    这个问题的措辞方式应该足以帮助您上路。 (此外,这似乎是家庭作业,对于家庭作业,我们倾向于指出解决方案而不提供实际解决方案。)

    在任何人都可以帮助您之前,您必须重写 move() 方法以使其被人类理解。

    • 提示 1:使用 switch() 语句。

    • 提示 2:将 default: 原因添加到您的 switch 语句中,如果达到该语句,则会引发异常。这样您就知道您不会生成从未处理过的数字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 2022-09-30
      • 1970-01-01
      • 2016-05-07
      • 2011-06-25
      • 1970-01-01
      • 2012-10-22
      相关资源
      最近更新 更多