Search code examples
javaperformancefor-loopoptimizationprocessing-efficiency

Can someone help me make this code more efficient?


I'm creating a skill tree calculator for a game. I wrote a method that checks whether or not it can subtract a point from the skill and then proceeds to do so. Everything is working as it should, however it's very slow when this method is executed in rapid succession (i.e. when 5 points are subtract at the same time).

Can anyone help me with this and more important explain why certain things are faster and what to avoid?

Here is the method:

public void cmdSubtractPoint(int index, SkillTree tree) {

    boolean subtract = false;

    if (this.blueTree.get(index).getInvestedPoints() != 0) {
        //Only subtract a point if the skill isn't empty

        if (index == 0 || index == 1) {
            if ((((this.blueTree.get(0).getInvestedPoints() + this.blueTree.get(1).getInvestedPoints()) - 1) < 5)
                    && ((this.blueTree.get(2).getInvestedPoints() + this.blueTree.get(3).getInvestedPoints() +
                    this.blueTree.get(4).getInvestedPoints() + this.blueTree.get(5).getInvestedPoints() + this.blueTree.get(6).getInvestedPoints()) != 0)) {
                this.showToast();
            } else if ((((this.blueTree.get(0).getInvestedPoints() + this.blueTree.get(1).getInvestedPoints()) + this.blueTree.get(2).getInvestedPoints() + this.blueTree.get(3).getInvestedPoints() - 1) < 10)
                    && ((this.blueTree.get(4).getInvestedPoints() + this.blueTree.get(5).getInvestedPoints() + this.blueTree.get(6).getInvestedPoints()) != 0)) {
                this.showToast();
            } else if ((((this.blueTree.get(0).getInvestedPoints() + this.blueTree.get(1).getInvestedPoints()) + this.blueTree.get(2).getInvestedPoints() + this.blueTree.get(3).getInvestedPoints() + this.blueTree.get(4).getInvestedPoints() + this.blueTree.get(5).getInvestedPoints() - 1) < 15)
                    && ((this.blueTree.get(6).getInvestedPoints()) != 0)) {
                this.showToast();
            } else {
                subtract = true;
            }
        } else if (index == 2 || index == 3) {
            if ((((this.blueTree.get(0).getInvestedPoints() + this.blueTree.get(1).getInvestedPoints()) + this.blueTree.get(2).getInvestedPoints() + this.blueTree.get(3).getInvestedPoints() - 1) < 10)
                    && ((this.blueTree.get(4).getInvestedPoints() + this.blueTree.get(5).getInvestedPoints() + this.blueTree.get(6).getInvestedPoints()) != 0)) {
                this.showToast();
            } else if ((((this.blueTree.get(0).getInvestedPoints() + this.blueTree.get(1).getInvestedPoints()) + this.blueTree.get(2).getInvestedPoints() + this.blueTree.get(3).getInvestedPoints() + this.blueTree.get(4).getInvestedPoints() + this.blueTree.get(5).getInvestedPoints() - 1) < 15)
                    && ((this.blueTree.get(6).getInvestedPoints()) != 0)) {
                this.showToast();
            } else {
                subtract = true;
            }
        } else if (index == 4 || index == 5) {
            if ((((this.blueTree.get(0).getInvestedPoints() + this.blueTree.get(1).getInvestedPoints()) + this.blueTree.get(2).getInvestedPoints() + this.blueTree.get(3).getInvestedPoints() + this.blueTree.get(4).getInvestedPoints() + this.blueTree.get(5).getInvestedPoints() - 1) < 15)
                    && ((this.blueTree.get(6).getInvestedPoints()) != 0)) {
                this.showToast();
            } else {
                subtract = true;
            }
        } else if (index == 6) {
                subtract = true;
        }

        if (subtract) {
            this.pointsInBlueTree -= 1;
            this.blueTree.get(index).subtractPoint();
        }

    }
}

Solution

  • If reduce value calculation to one time and use switch, you will obtain code similar this:

    public void cmdSubtractPoint(int index, SkillTree tree) {
    
            boolean subtract = false;
    
            if (this.blueTree.get(index).getInvestedPoints() != 0) {
                // Only subtract a point if the skill isn't empty
                int temp01 = this.blueTree.get(0).getInvestedPoints() + tree.blueTree.get(1).getInvestedPoints();
                int temp23 = this.blueTree.get(2).getInvestedPoints() + tree.blueTree.get(3).getInvestedPoints();
                int temp45 = this.blueTree.get(4).getInvestedPoints() + tree.blueTree.get(5).getInvestedPoints();
                int temp6 = this.blueTree.get(6).getInvestedPoints();
    
                switch (index) {
                case 0:
                case 1:
                    if (((temp01 ) < 6) && ((temp23 + temp45 + temp6) != 0)) {
                        this.showToast();
                    } else if (((temp01 + temp23) < 11) && ((temp45 + temp6) != 0)) {
                        this.showToast();
                    } else if (((temp01 + temp23 + temp45) < 16) && (temp6 != 0)) {
                        this.showToast();
                    } else {
                        subtract = true;
                    }
                    break;
                case 2:
                case 3:
                    if (((temp01 + temp23) < 11) && ((temp45 + temp6) != 0)) {
                        this.showToast();
                    } else if (((temp01 + temp23 + temp45) < 16) && (temp6 != 0)) {
                        this.showToast();
                    } else {
                        subtract = true;
                    }
                    break;
                case 4:
                case 5:
                    if (((temp01 + temp23 + temp45) < 16) && (temp6 != 0)) {
                        this.showToast();
                    } else {
                        subtract = true;
                    }
                    break;
                case 6:
                    subtract = true;
                    break;
                }
    
                if (subtract) {
                    this.pointsInBlueTree -= 1;
                    this.blueTree.get(index).subtractPoint();
                }
    
            }
        }