Java之深入JVM(2) - 由深入JVM(1)想到的一个面试题
2013-06-11 21:25
531 查看
面试题:i++和i--哪个快些?
这个不知道是哪位朋友跟我说的一个面试题,当时我听到这个题目的时候,我也不知所措,或许是对i++和i--的底层实现不知道,也或许没有关注过这个问题.
今天就在这里做个测试:
1.测试环境:电脑配置:
![](data:image/png;base64,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)
系统配置:
![](data:image/png;base64,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)
jdk版本:jdk1.6.0_20
2.测试代码:
3.字节码
这里为什么要把i置为100亿,因为在这个数字下面他们之间的区别才明显:27765ms,38516ms;经多次测试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++略耗时些。
其实还是不知道原来是什么....
相关文章推荐
- 深入JVM之号称世界上所有Java程序员都会犯的一个错误
- 深入JVM(3):由一个栈溢出的问题看Java类和对象的初始化续
- Java之深入JVM(4) - 由一个栈溢出的问题看Java类和对象的初始化续
- Java之深入JVM(1) - 由i++ 和 ++i的执行速度所想到的
- Java之深入JVM(1) - 由i++ 和 ++i的执行速度所想到的
- 匿名类~由一个貌似简单的java面试题所想到的···
- Java之深入JVM(3) - 由一个栈溢出的问题看Java类和对象的初始化
- Java之深入JVM(3) - 由一个栈溢出的问题看Java类和对象的初始化 (转)
- 【深入Java开发】JVM源码分析之一个Java进程究竟能创建多少线程
- 深入JVM(2): 由一个栈溢出的问题看Java类和对象的初始化
- Java面试题之JVM相关
- 【理解JVM】 深入分析Java ClassLoader原理
- JVM内存管理:深入Java内存区域与OOM
- java面试-深入理解JVM(三)——垃圾收集策略详解
- Java高级篇(四十六)------【深入理解JVM】:类加载器与双亲委派模型
- JVM内存管理:深入Java内存区域与OOM
- JVM源码分析之一个Java进程究竟能创建多少线程
- 深入理解JVM(八)——java堆分析
- 【深入理解Java虚拟机JVM】java如何实现跨平台
- 由一道面试题所想到的--Java实例变量初始化