A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王亚运 中级黑马   /  2012-9-18 01:18  /  1871 人查看  /  8 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

看到很多面试题有这个,
毕老师的基础教程也有。
然后给出的结果是无符号位移,
那天没事上网搜了下,有个帖子说的太深,大概讲的是计算机底层运算方法,
看完各种不懂,
自己小白级别,想到一个不知道算不算办法的办法。
刚看到可以获取时间方法。
就象获取两种运算的时间来判断运算是否是最快,
精确值是毫秒。。
第一次代码如下:
  1. class MinTimeText
  2. {
  3.         public static void main (String[] args)
  4.         {
  5.        
  6.         long time1=System.currentTimeMillis();//得到开始时间
  7.                 System.out.println("开始时间是"+time1);//输出开始时间
  8.         int mun1=2<<3;//第一中方法
  9.         long time2=System.currentTimeMillis();//得到结束时间
  10.                 System.out.println("结束时间是"+time2);//输出结束时间
  11.                 System.out.println("2<<3结果是"+mun1+"运行时间是"+(time2-time1));//完整输出
  12.         //----------------------------------------
  13.                 System.out.println();
  14.         long time3=System.currentTimeMillis();//得到开始时间
  15.                 System.out.println("开始时间是"+time3);////输出开始时间
  16.         int mun2=2*8;
  17.         long time4=System.currentTimeMillis();//得到结束时间
  18.                 System.out.println("结束时间是"+time4);//输出结束时间
  19.                 System.out.println("2×8运行结果是"+mun2+"运行时间是"+(time4-time3));//完整输出
  20.        
  21.         }

  22. }
复制代码
运行了几次结果不同。
如图:


感觉不是很爽。
是不是和CPU运行有关?
然后加了循环想看看时间是不是有变化。
然后改了下。
代码如下:
  1. class MinTimeText
  2. {
  3.         public static void main (String[] args)
  4.         {
  5.         int num1,num2;
  6.         long time1=System.currentTimeMillis();//得到开始时间
  7.         System.out.println("开始时间是"+time1);//输出开始时间
  8.         for(int a=1;a<=1000;a++);
  9.                 {
  10.                 num1=2<<3;//第一中方法
  11.                 }
  12.         long time2=System.currentTimeMillis();//得到结束时间
  13.         System.out.println("结束时间是"+time2);//输出结束时间
  14.         System.out.println("2<<3结果是"+num1+"运行时间是"+(time2-time1));//完整输出
  15.         //----------------------------------------
  16.         System.out.println();
  17.         long time3=System.currentTimeMillis();//得到开始时间
  18.         System.out.println("开始时间是"+time3);////输出开始时间
  19.         for(int b=1;b<=1000;b++);
  20.                 {
  21.                  num2=2*8;
  22.                  }
  23.         long time4=System.currentTimeMillis();//得到结束时间
  24.         System.out.println("结束时间是"+time4);//输出结束时间
  25.         System.out.println("2×8运行结果是"+num2+"运行时间是"+(time4-time3));//完整输出
  26.        
  27.         }

  28. }
复制代码
发现运行结果时间还是很少。
是不是我循环写错?

哪位大大讲解一下

谢谢
先睡 明天再看。

8 个回复

倒序浏览
{:soso_e136:}
不解
回复 使用道具 举报
本帖最后由 宁振庄 于 2012-9-21 20:47 编辑

你这种写法主要运算的是for循环了,而且对目前的CPU速度来说1000次运算太少了,你改成10000000次也看不出2<<3和2*8的速度会有什么差别。

2<<3和2*8的运算速度么....你眨眼的时间CPU都不知道能运算多少回了,就是那几个CPU时钟周期的区别,我们一般人大致知道就行了不必深究。
回复 使用道具 举报
不就是 2<<3 么
回复 使用道具 举报
                                 2<<3
回复 使用道具 举报
我觉得你的方法是得不到你想要的结果的
1 计算机不是只运行你java的这一个线程的,有可能运行到一半cpu运行了的其他程序,那么时间当然每次都不一样
2 从汇编考虑,x86构架移位指令是一个时钟周期,乘法好像是2个。微机原理学的有点久了,记错勿怪
3 但是呢,有的编译器会帮你把2*8编译成2<<3,那么实际上就一样了(以前弄c语言是这样)。不过不太清楚java的编译器是不是有这个设定。
结论:别去纠结这个问题,如果是我还会写2*8,毕竟代码看起来会清晰。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
王亚运 发表于 2012-9-21 20:27
不解

恩,看来和硬件有关。
谢谢讲解。
回复 使用道具 举报
皮卫凯 发表于 2012-9-21 20:38
不就是 2

就这,我还不会
回复 使用道具 举报
官仁杰 发表于 2012-9-22 21:16
我觉得你的方法是得不到你想要的结果的
1 计算机不是只运行你java的这一个线程的,有可能运行到一半cpu运行 ...

恩,2*8可读性好
貌似汇编就到底层了
有机会再学吧
java我还没看懂
谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马