Efficiency of Java code with primitive types

前端 未结 9 911
遥遥无期
遥遥无期 2021-01-03 12:18

I want to ask which piece of code is more efficient in Java? Code 1:

void f()
{
 for(int i = 0 ; i < 99999;i++)
 {
  for(int j = 0 ; j < 99999;j++)
  {         


        
9条回答
  •  猫巷女王i
    2021-01-03 12:24

    I would prefer the first over the second because it keeps the loop variables out of the way of the rest of the code in the method. Since they're not visible outside of the loop, you can't accidentally refer to them later on.

    The other answers are right, too: don't worry about this sort of thing for performance. But do think about it for code readability reasons, and for communicating programmer intent to the next person who comes along. This is much more important than micro-optimization concerns.

    Now, that's at the Java language (as in Java Language Specification) level. At the Java Virtual Machine level, it makes absolutely no difference which of those two you use. The locals are allocated in exactly the same way.

    If you're not sure, you can always compile it and see what happens. Let's make two classes, f1 and f2, for the two versions:

    $ cat f1.java
    public class f1 {
      void f() {
        for(int i = 0 ; i < 99999;i++) {
          for(int j = 0 ; j < 99999;j++) {
          }
        }
      }
    }
    
    $ cat f2.java
    public class f2 {
      void f() {
        int i, j;
        for(i = 0 ; i < 99999;i++) {
          for(j = 0 ; j < 99999;j++) {
          }
        }
      }
    }
    

    Compile them:

    $ javac f1.java
    $ javac f2.java
    

    And decompile them:

    $ javap -c f1 > f1decomp
    $ javap -c f2 > f2decomp
    

    And compare them:

    $ diff f1decomp f2decomp
    1,3c1,3
    < Compiled from "f1.java"
    < public class f1 extends java.lang.Object{
    < public f1();
    ---
    > Compiled from "f2.java"
    > public class f2 extends java.lang.Object{
    > public f2();
    

    There's absolutely no difference in the bytecode.

提交回复
热议问题