日期:2014-05-20  浏览次数:20697 次

Java中的运算性能问题
我在测试一个程序运行效率,遇到如下问题:
大家可以测试一下代码,job1和job2分别在循环中计算0.299*x1的值,然后赋给x2
job1使用double作为数据类型,job2使用int,并且0.299*x进行了些优化,变成299*x/4096,4096可以向右移位12,所以变成了299*x/4096
这样来说应该job2的速度快了,可是结果却是这样的:

159.367
job   1   running   time:797   millsec
159
job   2   running   time:687   millsec

159.367
job   1   running   time:469   millsec
159
job   2   running   time:703   millsec

159.367
job   1   running   time:438   millsec
159
job   2   running   time:671   millsec

159.367
job   1   running   time:454   millsec
159
job   2   running   time:718   millsec


代码如下:
package   performance;

import   java.util.Date;

public   class   PerformanceCalculator   {
private   int   intA;
private   int   intB;
private   double   doubleA;
private   double   doubleB;

public   static   void   main(String[]   args)   {
PerformanceCalculator   pc   =   new   PerformanceCalculator();
while(true)   {
pc.performanceCalculate();
}
}

public   PerformanceCalculator()   {
intA   =   0;
intB   =   533;
doubleA   =   0;
doubleB   =   533;
}

public   void   performanceCalculate()   {
long   startTime   =   new   Date().getTime();

//job1
//put   code   here
startTime   =   new   Date().getTime();
for(int   i=0;i <10000;i++)   {
for(int   j=0;j <10000;j++)   {
doubleA   =   0.299*doubleB;
}
}
System.out.println(doubleA);
//end   put   code   here

long   endTime   =   new   Date().getTime();
System.out.println( "job   1   running   time: "+(endTime-startTime)+ "   millsec ");

//job2
//put   code   here
startTime   =   new   Date().getTime();
for(int   i=0;i <10000;i++)   {
for(int   j=0;j <10000;j++)   {
intA   =   1224*intB;
intA   =   intA> > 12;
}
}
System.out.println(intA);
//end   put   code   here

endTime   =   new   Date().getTime();
System.out.println( "job   2   running   time: "+(endTime-startTime)+ "   millsec ");
System.out.println();
}
}


大家能帮我分析一下为什么吗?谢谢啦,BTW,我的CPU是CORE   DUO   2   T5500,不知道会不会对结果有影响

------解决方案--------------------
job1进行了一次操作: doubleA = 0.299*doubleB;
job2进行了二次操作: intA = 1224*intB; intA = intA> > 12;

操作命令的次数多,相对时间也要多一些.还有有的就是进行这么多次循环,有可能进行到一半的时间,循环被挂起而不被执行,进入进程等待队列里,这个是不定因素,所以耗时也不确定,但总的来说,操作命令次数多了,时间相对就会较长一些.
------解决方案--------------------
既然用 Java 就不要太关心效率,不太慢就行了.
Java 程序真正慢的地方是 一层一层的函数调用 还有 一层一层的异常处理
计算的部分接近于C