黑马程序员技术交流社区

标题: 一点关于最快方法求2×8的肤浅思考 [打印本页]

作者: 王亚运    时间: 2012-9-18 01:18
标题: 一点关于最快方法求2×8的肤浅思考
看到很多面试题有这个,
毕老师的基础教程也有。
然后给出的结果是无符号位移,
那天没事上网搜了下,有个帖子说的太深,大概讲的是计算机底层运算方法,
看完各种不懂,
自己小白级别,想到一个不知道算不算办法的办法。
刚看到可以获取时间方法。
就象获取两种运算的时间来判断运算是否是最快,
精确值是毫秒。。
第一次代码如下:
  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. }
复制代码
发现运行结果时间还是很少。
是不是我循环写错?

哪位大大讲解一下

谢谢
先睡 明天再看。

作者: 王亚运    时间: 2012-9-21 20:27
{:soso_e136:}
不解
作者: 宁振庄    时间: 2012-9-21 20:36
本帖最后由 宁振庄 于 2012-9-21 20:47 编辑

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

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

恩,看来和硬件有关。
谢谢讲解。
作者: 王亚运    时间: 2012-10-2 20:22
皮卫凯 发表于 2012-9-21 20:38
不就是 2

就这,我还不会
作者: 王亚运    时间: 2012-10-2 20:23
官仁杰 发表于 2012-9-22 21:16
我觉得你的方法是得不到你想要的结果的
1 计算机不是只运行你java的这一个线程的,有可能运行到一半cpu运行 ...

恩,2*8可读性好
貌似汇编就到底层了
有机会再学吧
java我还没看懂
谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2