Java之深入JVM(2) 由深入JVM(1)想到的一个面试题

面试题:i++和i--哪个快些?

这个不知道是哪位朋友跟我说的一个面试题,当时我听到这个题目的时候,我也不知所措,或许是对i++和i--的底层实现不知道,也或许没有关注过这个问题.

今天就在这里做个测试:

1.测试环境:电脑配置: 系统配置: jdk版本:jdk1.6.0_20

2.测试代码:

package Sort;

public class Increament {

    /**
     * @param args
     * @throws InterruptedException 
     */
    public static void main(String[] args) throws InterruptedException {
        decrement();
        increment();
    }
    
    
    public static void decrement() {
        long start2 = System.currentTimeMillis();
        for(long i = 100000000L; i > 0; i--) {
        }
        long end2 = System.currentTimeMillis() - start2;
        System.out.println(end2);
    }
    
    public static void increment() {
        long start = System.currentTimeMillis();
        for(long i = 1; i < 100000000L; i ++) {
        }
        long end1 = System.currentTimeMillis() - start;
        System.out.println(end1);
    }
}

3.字节码

D:\jdk1.6.0_20\bin>javap -c Increament
Compiled from "Increament.java"
public class Increament extends java.lang.Object{
public Increament();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[])   throws java.lang.InterruptedException;
  Code:
   0:   invokestatic    #2; //Method decrement:()V
   3:   invokestatic    #3; //Method increment:()V
   6:   return

public static void decrement();
  Code:
   0:   invokestatic    #4; //Method java/lang/System.currentTimeMillis:()J
   3:   lstore_0
   4:   ldc2_w  #5; //long 100000000l
   7:   lstore_2
   8:   lload_2
   9:   lconst_0
   10:  lcmp
   11:  ifle    21
   14:  lload_2
   15:  lconst_1
   16:  lsub
   17:  lstore_2
   18:  goto    8
   21:  invokestatic    #4; //Method java/lang/System.currentTimeMillis:()J
   24:  lload_0
   25:  lsub
   26:  lstore_2
   27:  getstatic       #7; //Field java/lang/System.out:Ljava/io/PrintStream;
   30:  lload_2
   31:  invokevirtual   #8; //Method java/io/PrintStream.println:(J)V
   34:  return

public static void increment();
  Code:
   0:   invokestatic    #4; //Method java/lang/System.currentTimeMillis:()J
   3:   lstore_0
   4:   lconst_1
   5:   lstore_2
   6:   lload_2
   7:   ldc2_w  #5; //long 100000000l
   10:  lcmp
   11:  ifge    21
   14:  lload_2
   15:  lconst_1
   16:  ladd
   17:  lstore_2
   18:  goto    6
   21:  invokestatic    #4; //Method java/lang/System.currentTimeMillis:()J
   24:  lload_0
   25:  lsub
   26:  lstore_2
   27:  getstatic       #7; //Field java/lang/System.out:Ljava/io/PrintStream;
   30:  lload_2
   31:  invokevirtual   #8; //Method java/io/PrintStream.println:(J)V
   34:  return

这里为什么要把i置为100亿,因为在这个数字下面他们之间的区别才明显:27765ms,38516ms;经多次测试i++略耗时些。

其实还是不知道原来是什么....

 
 
原文地址:https://www.cnblogs.com/royi123/p/3132083.html