7.7 Performance Checklist

Most of these suggestions apply only after a bottleneck has been identified:

  • Make the loop do as little as possible.

    • Remove from the loop any execution code that does not need to be executed on each pass.

    • Move any code that is repeatedly executed with the same result, and assign that code to a temporary variable before the loop ("code motion").

    • Avoid method calls in loops when possible, even if this requires rewriting or inlining.

    • Multiple access or update to the same array element should be done on a temporary variable and assigned back to the array element when the loop is finished.

    • Avoid using a method call in the loop termination test.

    • Use int data types preferentially, especially for the loop variable.

    • Use System.arraycopy( ) for copying arrays.

    • Try to use the fastest tests in loops.

    • Convert equality comparisons to identity comparisons when possible.

    • Phrase multiple boolean tests in one expression so that they "short circuit" as soon as possible.

    • Eliminate unneeded temporary variables from loops.

    • Try unrolling the loop to various degrees to see if this improves speed.

  • Rewrite any switch statements to use a contiguous range of case values.

  • Identify whether a recursive method can be made faster.

    • Convert recursive methods to use iteration instead.

    • Convert recursive methods to use tail recursion.

    • Try caching recursively calculated values to reduce the depth of recursion.

    • Use temporary variables in place of passed parameters to convert a recursive method using a single search path into an iterative method.

    • Use temporary stacks in place of passed parameters to convert a recursive method using multiple search paths into an iterative method.