首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

关于移位和直接相乘的有关问题

2012-03-06 
关于移位和直接相乘的问题Java codeint x 1, yy 0long timefor(int k0 k8 k++) {time System

关于移位和直接相乘的问题

Java code
int x = 1, y;        y = 0;        long time;        for(int k=0; k<8; k++) {            time = System.currentTimeMillis();            for(long j=0; j<2000000000; j++)                y = 2 * x;            System.out.println("所用时间1:" + (System.currentTimeMillis() - time));                               time = System.currentTimeMillis();            for(long j=0; j<2000000000; j++)                y = x << 1;            System.out.println("所用时间2:" + (System.currentTimeMillis() - time));                        System.out.println();        }

程序运行结果
所用时间1:10312
所用时间2:8782

所用时间1:9562
所用时间2:8734

所用时间1:10047
所用时间2:8766

所用时间1:10047
所用时间2:9078

所用时间1:9859
所用时间2:9141
Java code
int x = 1, y;        y = 0;        long time;        for(int k=0; k<8; k++) {            time = System.currentTimeMillis();            for(long j=0; j<2000000000; j++)                y = x << 1;            System.out.println("所用时间1:" + (System.currentTimeMillis() - time));                               time = System.currentTimeMillis();            for(long j=0; j<2000000000; j++)                y = 2 * x;                            System.out.println("所用时间2:" + (System.currentTimeMillis() - time));                        System.out.println();        }

结果:
所用时间1:10000
所用时间2:8703

所用时间1:9188
所用时间2:8468

所用时间1:9969
所用时间2:9125

所用时间1:9891
所用时间2:8875

所用时间1:9906
所用时间2:9125

我想问下为什么放在后面的表达式所用的时间更短。


[解决办法]
这问题高深了。。静候高人。。
[解决办法]
我觉得不是放在代码前后的问题,本来就移位就应该比用*,/,+,-快!您再仔细审核一下程序。
[解决办法]
如果在跑这个测试程序的时候同时机器用做其他的事情,可能会受一定的影响。楼主的程序在我的机器上跑了下,没干其他的事情,基本上,直接的位移运算是要比累乘快一点点的。
[解决办法]
探讨
我觉得不是放在代码前后的问题,本来就移位就应该比用*,/,+,-快!您再仔细审核一下程序。

[解决办法]
我只发现一点,那就是for循环是时间的焦点,第一个for循环会很慢。原因未知!
[解决办法]
探讨
我只发现一点,那就是for循环是时间的焦点,第一个for循环会很慢。原因未知!

[解决办法]
移位是直接运算了
而*它是通过一系列的移位运算得来的,当然要慢了
[解决办法]
确实是这样的啊~~~

在程序在jvm的作用下运行时,*2的操作会被优化成移位操作,所以这两个的运行时间是一样的,如果将程序单独写在两个类中单独运行,时间基本相同。
Java code
所用时间1:5953所用时间1:5953所用时间1:5937所用时间1:5953所用时间1:5954------所用时间2:5969所用时间2:5953所用时间2:5968所用时间2:5954所用时间2:5968------执行时间基本相同
[解决办法]
这个要学习
[解决办法]
基本上搞明白了,但有一些不清楚的地方,我的结论是,
1、如果连续两个相邻的相类似的结构的循环,java会做某种优化,具体怎么优化的不太清楚。
2、对于循环体比较简单的循环,时间大部分花在了循环控制上。
3、+,-,*这样的运算,时间差不多,区别不是太大。但/和%运算花的时间是前者7~8倍之多。
4、for(long n=200000000;n>0;n--)这种结构的循环,在循环控制上花的时间,是与之相反的循环的近一倍。
看我的测试:
Java code
public class test6{    public static void main(String [] args) {        int x = 333333333, y;        y = 0;        long time;        for(int k=0; k<8; k++) {            time = System.currentTimeMillis();            for(long j=0; j<2000000000; j++)                y = x *5;            System.out.println("所用时间1:" + (System.currentTimeMillis() - time));              //****插入下面这个循环,目的是使前后两循环在执行顺序上相隔开。打乱java的优化。                for(long m=10000;m>1000;m--){                for(int n=0;n<100000;n++);            }            time = System.currentTimeMillis();            for(long j=0; j<2000000000; j++)                y =  x<<2;                            System.out.println("所用时间2:" + (System.currentTimeMillis() - time));                        System.out.println();        }    }} 


[解决办法]
老哥。。你电脑的问题吧。。。我们学校电脑的存储过程。。第二次比第一次执行的都快。。。电脑有时候也出问题。。。
[解决办法]
测试的时候,应该关闭大多数的应该程序.
[解决办法]
不错
[解决办法]
学习了
[解决办法]

探讨
老哥。。你电脑的问题吧。。。我们学校电脑的存储过程。。第二次比第一次执行的都快。。。电脑有时候也出问题。。。

[解决办法]
学习一下 。。没见过类似问题
[解决办法]
学习……
[解决办法]
学习中1
[解决办法]
真的有区别吗?
[解决办法]
其实如果你的乘数有一个都写死了的话
编译器应该会自动使用移位的方式计算的
如果结果相差不大,个人感觉,是不同机器,或其他方面的问题
[解决办法]
关注中....
[解决办法]
学习一下
[解决办法]
做一个有美德的人
[解决办法]

[解决办法]
继续关注进展...
[解决办法]
经典,学习了
[解决办法]
高手啊,佩服,学习了
[解决办法]
wo yun le
[解决办法]
雖然睇唔明~~不過都頂一下~~
[解决办法]
先不论程序的时间对比。
在比对时间时,并没有考虑操作系统的时间片调度的问题,得出来的结果是能进行定性分析。程序运行中处理器给程序分配的时间片和调试方式也不是每次都相同。
[解决办法]
做一个有美德的人
[解决办法]
做一个有美德的人
[解决办法]
[Quote=引用:]
Java codeint x=1, y;
y=0;long time;for(int k=0; k<8; k++) {
time= System.currentTimeMillis();for(long j=0; j<2000000000; j++)
y=2* x;
System.out.println("所用时间1:"+ (System.currentTimeMillis()- time));

time= System.currentTimeMillis();for(long j=0; j<2000000000; j++)
y= x<<1;
System.out.println("所用时间2:"+ (System.currentTimeMillis()- time));

System.out.println();
}
程序运行结果
所用时间1:10312
所用时间2:8782

所用时间1:9562
所用时间2:8734

所用时间1:10047
所用时间2:8766

所用时间1:10047
所用时间2:9078

所用时间1:9859
所用时间2:9141
Java codeint x=1, y;
y=0;long time;for(int k=0; k<8; k++) {
time= System.currentTimeMillis();for(long j=0; j<2000000000; j++)
y= x<<1;
System.out.println("所用时间1:"+ (System.currentTimeMillis()- time));

time= System.currentTimeMillis();for(long j=0; j<2000000000; j++)


y=2* x;
System.out.println("所用时间2:"+ (System.currentTimeMillis()- time));

System.out.println();
}
结果:
所用时间1:10000
所用时间2:8703

所用时间1:9188
所用时间2:8468

所用时间1:9969
所用时间2:9125

所用时间1:9891
所用时间2:8875

所用时间1:9906
所用时间2:9125

我想问下为什么放在后面的表达式所用的时间更短。

通过横向和纵向比较,得出剩法运算比移位运算慢,这符合cpu计算原理,关键在于时间1比2快,期间函数只调用过库函数,我想更应该说过程2比1快,初始调用应该比以后的调用慢吧,只是说说,无确实证据!
[解决办法]

探讨
4、for(long n=200000000;n>0;n--)这种结构的循环,在循环控制上花的时间,是与之相反的循环的近一半。

热点排行