我们知道数值类型的位运算要远比乘除运算要快的多,这是因为位运算只需要移动几下位模式就行,时间消耗非常小,而乘除运算就得运算乘数次的加法运算;比如:
256<<2 这是将256的二进制向左移动了2位,相当于256*4
256*4 256直接乘以4(2^2),相当于256+256+256+256
两者的结果是一样的,再运算量很小时,可能看不出时间损耗差异,但当运算量特别大时,时间损耗的优虐就会显现出来(运算量越大,位运算就越能体现优势).下面我们看一段代码来看看:
public static void main(String[] args){
System.out.println("乘法运算:"+256*4);
System.out.println("位运算:"+(256<<2));
long time1=System.currentTimeMillis();
for(int i=0;i<10000000;i++){
int a=0;
a=256*4;
}
System.out.println("乘法运算消耗时间:"+(System.currentTimeMillis()-time1));
long time2=System.currentTimeMillis();
for(int i=0;i<10000000;i++){
int a=0;
a=256<<2;
}
System.out.println("位运算消耗时间:"+(System.currentTimeMillis()-time2));
}
我们来看一下运行结果:
从结果我们可看出乘法运算的时间损耗是位运算的2倍多,这还是乘数4很小的情况,当乘数越大时,这种差异就会越明显。
所幸,现在Java设计者认识到了这个问题,所以对java乘除做了一些优化:将乘除法转化为位运算,所以当你发现位运算时间和乘除法运算时间相差不多的时候,不要慌,这是因为你的Java版本已经添加了对乘除法的优化。这时有的小伙伴可能就要问了,居然优化了。那么位运算和乘除运算的时间消耗也应该相同了,那为什么位运算还是比乘除运算快那么一丢丢呢?这是因为乘除运算后台虽然是位运算,但我们忽略了乘除运算中将乘数/除数的转为成二进制时消耗的时间。比如:
对256*312进行运算时,
1.优化的Java会先将312变成256+32+16+8(即2^8+2^5+2^4+2^3)
2.然后才进行位运算256<<8+256<<5+256<<4+256<<3
所以优化之后的乘除法运算只是比位运算多了第一步消耗的时间,而这部分时间对于一个很大运算量的运算来说是微不足道的,甚至可以忽略不记。