问题:java中,位移没有比用乘法快么?还是程序写得不对

zhm_icbchz 2016-12-05 07:17:05
今天看到有个问题,用最有效率的方法算出2乘以8等於几,按照以前 C的经验,位移比较快,这个题的答案也是2<<3最有效率
但是写了个代码试了下,发现位移还比*慢一点,为什么?是不是代码写的不对,以下是代码:

public static void main(String []args){
int a=2;
int b=2;
int aResult;
int bResult;
long startTime;
long endTime;
long time;
startTime=System.currentTimeMillis();
for(int i=0;i<100000000;i++){
aResult=a<<3;
}
endTime=System.currentTimeMillis();
time=endTime-startTime;
System.out.println("位移100000000次时间:"+time);

startTime=System.currentTimeMillis();
for(int i=0;i<100000000;i++){
bResult=b*8;
}
endTime=System.currentTimeMillis();
time=endTime-startTime;
System.out.println("乘法100000000次时间:"+time);
}

基本上每次都是位移慢几毫秒,是不是写的程序哪里没考虑到呢?
...全文
438 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhm_icbchz 2016-12-09
  • 打赏
  • 举报
回复
将两个放到两个main中跑,各跑了六次 位移六次的时间分别是:103,68,68,68,67,71 乘法六次的时间分别是:67,68,68,66,73,66 在测试linux服务器上是 位移时间分别是:7,7,7,7,6 乘法时间分别是:7,7,6,6,7 大概都差不多,乘法稍稍快一点,难道是因为cpu里面现在乘法器已经非常快了,粗略得看难以看出差别来了?
zhm_icbchz 2016-12-08
  • 打赏
  • 举报
回复
就是将*8和<<3等同起来
zhm_icbchz 2016-12-08
  • 打赏
  • 举报
回复
12: goto 22 15: iload_1 16: iconst_3 17: ishl //位移指令 18: istore_3 19: iinc 11, 1 22: iload 11 24: ldc #22; //int 100000000 72: goto 84 75: iload_2 76: bipush 8 78: imul //乘法指令 79: istore 4 81: iinc 11, 1 84: iload 11 从这两段看,应该不是jvm这边编译优化的,那么可能是操作系统层面做的?好像没法验证啊
逗泥丸的平方 2016-12-08
  • 打赏
  • 举报
回复
http://bbs.pediy.com/showthread.php?t=149969 再就是 你要作比较的话 就不要把它们放在一个main里面跑. 公平竞争 每个跑三五次 求一下平均数
逗泥丸的平方 2016-12-07
  • 打赏
  • 举报
回复
就算作比较也要分开跑呀
bree06 2016-12-06
  • 打赏
  • 举报
回复
MS现代的编译器都会自动将2*8编译为2<<3
萧乡月夜 2016-12-05
  • 打赏
  • 举报
回复
我在本地run了3次该程序,得到结果如下: 位移100000000次时间:6 乘法100000000次时间:11 位移100000000次时间:6 乘法100000000次时间:9 位移100000000次时间:13 乘法100000000次时间:8 亦即结果的时间长短受当时cpu时间分配影响较大,基本无效。 如果真要研究此类性能问题的话,得比较字节码。 个人猜测目前的编译优化有可能将*8编译为<<3,亦即编译后两个版本字节码等同。
爱睡觉的阿狸 2016-12-05
  • 打赏
  • 举报
回复
你可以建两个类测一下。
  • 打赏
  • 举报
回复
你把两个for(){}互换一下位置测试一下,可以发现在前面的普遍会比较快
soton_dolphin 2016-12-05
  • 打赏
  • 举报
回复
你这两个计算的过程是不完全一样的,可能在某一个计算的过程中,你电脑的cpu分配了时间给其他的进程,影响了速度

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧