我在测试一个程序运行效率,遇到如下问题:
大家可以测试一下代码,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 millsec159.367
job 1 running time:469 millsec
159
job 2 running time:703 millsec159.367
job 1 running time:438 millsec
159
job 2 running time:671 millsec159.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和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 millsec159.367
job 1 running time:469 millsec
159
job 2 running time:703 millsec159.367
job 1 running time:438 millsec
159
job 2 running time:671 millsec159.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,不知道会不会对结果有影响
解决方案 »
- 高手来讲讲基础问题
- jfreechart 生成的柱状图
- 关于Exception的问题
- 初学JAVA编程,关于文本框输入回车,将字符送入文本区域的问题.
- jni的错误怎么看?高人指导一下
- 谁能告诉我SOFT 和WEAK REFERENCE 的回收机制,有例子最好!
- java怎样实现 运行dos命令行的命令或者windows的程序
- 怎样用forname()动态装载一个自己编译好的类?
- 请问这个错是由什么引起的?谢谢(有内容)
- No buffer space available (maximum connections reached?): recv failed
- 反编译 的程序 大家帮我看,怎么修改 100分
- 初学者有关线程的基础问题
job2进行了二次操作: intA = 1224*intB; intA = intA>>12;操作命令的次数多,相对时间也要多一些.还有有的就是进行这么多次循环,有可能进行到一半的时间,循环被挂起而不被执行,进入进程等待队列里,这个是不定因素,所以耗时也不确定,但总的来说,操作命令次数多了,时间相对就会较长一些.
Java 程序真正慢的地方是 一层一层的函数调用 还有 一层一层的异常处理
计算的部分接近于C