您的位置:首页 > 职场人生

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

2013-06-11 21:25 531 查看
面试题: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++略耗时些。

其实还是不知道原来是什么....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: