Why is the Java store bytecode often accompanied by a download?

When I read the jvm bytecode, which, from some small java function, found that when a new local variable pays off in the operand stack, assuming that it will be stored in the local variable table, but usually it will be loaded into the operand stack immediately (only in in terms of bytecode literally). I am not very good at this operation, is this an extra operation?

+5
source share
2 answers

The Java compiler tends to compile things in a very simple and easy way, leaving the optimization for JIT.

For example, if you write x *= 3; x *= 4; x *= 3; x *= 4; you will probably get bytecode in lines

 iload_1 iconst_3 imul istore_1 iload_1 iconst_4 imul istore_1 

The compiler could theoretically find out that the store / load pair is redundant and removes it. But there are several reasons not to do this - 1) it adds a lot of complexity, since there is no benefit, since JIT optimizes everything anyway 2) it makes debugging more difficult, since you no longer have access to the values โ€‹โ€‹of all local variables 3) if an exception thrown out somehow in the middle of this expression, local variables will have the wrong values.

+6
source

Looking for dspin bytecode

 Method void dspin() 0 dconst_0 // Push double constant 0.0 1 dstore_1 // Store into local variables 1 and 2 2 goto 9 // First time through don't increment 5 dload_1 // Push local variables 1 and 2 6 dconst_1 // Push double constant 1.0 7 dadd // Add; there is no dinc instruction 8 dstore_1 // Store result in local variables 1 and 2 9 dload_1 // Push local variables 1 and 2 10 ldc2_w #4 // Push double constant 100.0 13 dcmpg // There is no if_dcmplt instruction 14 iflt 5 // Compare and loop if less than (i < 100.0) 17 return // Return void when done 

The only load that follows the store is at offset 9. You can see that offset 9 can be reached in two different ways: (1) from offset 2 with goto 9 ; and (2) sequentially from offset 8

dload_1 pushes the value of local variables 1 and 2 to the operand stack (two variables due to double ): in case (1) when trying to enter the loop for the first time, and in case (2) when trying to enter the loop at later times .

Interestingly, in this example, if you delete all store and load , the behavior of the program will not change. However, the Java compiler does not usually try to be smart. It compiles Java code more or less directly. In this case, the local variable i directly corresponds to the local variables 1 and 2.

For more information, see Optimization Using the Java Compiler .

+4
source

Source: https://habr.com/ru/post/1265420/


All Articles