java代码性能_问一个JAVA代码性能问题

阿神2017-04-17 14:47:382楼

对于这个问题,一般的答案是“差不多,没有区别”;

而钻牛角尖的答案是“2的性能比1稍好”;

下面的代码:

HashMap m1 = new HashMap<>();

m1.put("test", "test");

m1.get("test");

Map m2 = new HashMap<>();

m2.put("test", "test");

m2.get("test");

编译成字节码后对应的指令是:

0: new #16 // class java/util/HashMap

3: dup

4: invokespecial #18 // Method java/util/HashMap."":()V

7: astore_1

8: aload_1

9: ldc #19 // String test

11: ldc #19 // String test

13: invokevirtual #21 // Method java/util/HashMap.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;

16: pop

17: aload_1

18: ldc #19 // String test

20: invokevirtual #25 // Method java/util/HashMap.get:(Ljava/lang/Object;)Ljava/lang/Object;

23: pop

24: new #16 // class java/util/HashMap

27: dup

28: invokespecial #18 // Method java/util/HashMap."":()V

31: astore_2

32: aload_2

33: ldc #19 // String test

35: ldc #19 // String test

37: invokeinterface #29, 3 // InterfaceMethod java/util/Map.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;

42: pop

43: aload_2

44: ldc #19 // String test

46: invokeinterface #32, 2 // InterfaceMethod java/util/Map.get:(Ljava/lang/Object;)Ljava/lang/Object;

51: pop

52: return

可见情况1的map的put/get操作是用invokevirtual指令完成的;

而情况2的map的put/get操作是用invokeinterface指令完成的;

而论实现的话,invokevirtual的性能略优于invokeinterface, 因此硬要说谁性能好的话那就是2;

最后提醒一下,在java编程过程中,任何jvm指令我们都应该看作是差不多一样的常数级时间开销,哪怕它是invokedynamic,这才能为我们的上层算法、逻辑优化带来统一、无干扰的视角;

为了钻牛角尖地挑选jvm指令而改变java代码的写法是不理智的,且其结论也是不稳定的 —— 它可能会随着jvm升级换代而变化的, 而且为了这种“性能提升”而带来的代码改动导致可读性、可维护性降低也是得不偿失的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值