注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天朝布衣田中码农参上

苦逼码农的点点滴滴,请多多指教!

 
 
 

日志

 
 
 
 

追寻真相:Java中位运算是否真的比*/运算快  

2016-11-19 18:23:37|  分类: JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
大家都知道,java在提升性能的时候,有人会建议用位运算来替换相关的*/运算,相关的解释是:"/"或"*"是一个很“昂贵”的操作,使用移位操作将会更快更有效。但真实环境中,除非是在一个非常大的循环内,性能非常重要,而且也很清楚自己在做什么,方可使用这种方法【因为这种操作并不是那么直观】。那么这个性能提升到底有没有网上说的那么夸张呢?
我们可以用如下的简易代码来测试下【这里仅是测试下性能,并无任何意义,大神勿喷】

package com.topone;

public class Main {

static int result;

public static void main(String[] args) {
long starttime=System.nanoTime();
result=calculate1(8);
//测试下判断方法1
long op1=System.nanoTime()-starttime;
System.out.println("op1 result:"+result+" time:"+op1);
starttime=System.nanoTime();
result=calculate2(8);
//测试下判断方法2
long op2=System.nanoTime()-starttime;
System.out.println("op2 result:"+result+" time:"+op2);
starttime=System.nanoTime();
result=calculate3(8);
//测试下判断方法3
long op3=System.nanoTime()-starttime;
System.out.println("op3 result:"+result+" time:"+op3);
starttime=System.nanoTime();
result=calculate4(8);
//测试下判断方法4
long op4=System.nanoTime()-starttime;
System.out.println("op4 result:"+result+" time:"+op4);
starttime=System.nanoTime();
result=calculate5(8);
//测试下判断方法5
long op5=System.nanoTime()-starttime;
System.out.println("op5 result:"+result+" time:"+op5);
starttime=System.nanoTime();
result=calculate6(8);
//测试下判断方法4
long op6=System.nanoTime()-starttime;
System.out.println("op6 result:"+result+" time:"+op6);
}

public static int calculate1(int a){
return a*8;
}

public static int calculate2(int a){
return a<<3;
}

public static int calculate3(int a){
return a/8;
}

public static int calculate4(int a){
return a>>3;
}

public static int calculate5(int a){
return a*5;
}
public static int calculate6(int a){
//相当于X5
return (a<<2)+a;
}
}

显示结果如下:
追寻真相:Java中位运算是否真的比*/运算快 - sinsunson - 天朝布衣田中码农参上
可以看到,其实真相跟网上说的完全不一样,*/运算速度是比位运算差一些,但是这个带来的性能调优并不如想象的大,而且,使用位运算还会让代码并不那么直观。当然,通过以上结果可以看出,*操作的性能确定可以提升一点,但/操作的区别就没有那么大,而且如果*操作的运算数并不是2的次方表,那么其实这个性能提升真的可以无视了。当然也不能够说这个优化建议就没用,以上测试环境是JDK6,也许本身就针对这个操作做了优化,所以可以说,如果是早期的JDK,可以尝试下,如果是JKD6之后,那么还是建议不用再这样优化了。
 
  评论这张
 
阅读(1)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018