测评 | 2左移3 的效率高于2*8 吗?

问:有一道面试题:2*8怎样运算效率最快?

参考答案是:位移运算最快,即计算2*8最快的方法是:2 << 3 。

我的问题是:我目前也接触了不少项目,但经常能看到 乘除运算。为什么很多项目里,不使用性能最快的位移运算呢?

 

答:网上的“面试宝典”,不知道是哪一年流传出来的了。即使是“202x年最新版面试宝典”,也基本换汤不换药。

换个角度,这种“面试题”级别的性能问题,JAVA设计者们肯定是早都发现了。因此目前的JVM内部必然已经做了优化,几乎不用我们在 运算上 思考性能问题了。

我想说的是:不论是位运算,还是四则运算,性能是不会有明显差异的。(要相信JAVA底层已经做足了优化,不必我们事事费心)。

 

Talk is cheap, let's code

 

下面测试一下两种方式(位运算 和 乘法运算)的执行时间。

 

1.先使用位运算计算2*8,重复约43亿次。

 

long start1 = System.nanoTime();
int result = 0 ;
//循环约43亿次
for(int i=Integer.MIN_VALUE;i< Integer.MAX_VALUE;i++) {
    result = 2 << 3 ;
}
long times = 1L*Integer.MAX_VALUE - Integer.MIN_VALUE ;
long end1 = System.nanoTime();
long total1 = end1 - start1 ;
System.out.println("位移运算:\t共耗时" + total1 + "ns\t平均耗时:"+total1/times);

 

 

2.然后再使用乘法运算,重复约43亿次(为了保证两种运算时的 系统环境一致,本次是将两种方式放在了 同一个方法中执行)。

long start2 = System.nanoTime();
for(int i=Integer.MIN_VALUE;i

 

3.最后测试一下“空语句”的执行时间,用于对比。

long start3 = System.nanoTime();
for(int i=Integer.MIN_VALUE;i

 

运行结果:

位移运算:    共耗时2347200ns    平均耗时:0
四则运算:    共耗时2289800ns    平均耗时:0
空闲操作:    共耗时2869500ns    平均耗时:0

 

可以发现:位移运算、四则运算和空闲操作,在性能上 基本没有什么差别(从本次结果来看,“空闲操作”甚至比 其他运算时间还慢;这和系统资源准备情况有关,属于一种“随机”,不用理会)。

 

总结:注重细节是好事,但也要防止网上一些“过时”的结论。如果有疑惑,不妨自己测试一下。

 

 

- 完 -

推荐阅读

Java小白到大神的心路历程(Java SE)

答疑 | 面试全对,却没offer?

答疑 | 背下这300字,面试就能加薪!

你可能感兴趣的:(JAVA)