Java的一个循环效率问题

我写了一个简单,其中一个看似普通的循环却出乎了我的意料,是用Java写的。其中yz及pow的底数我现在改了一下:

//方法一:
double w = 0.0, yz = 1.234567;
for (int i = 0; i < currents.length; i++) {
    if (currents[i] > i2) {
        w += yz * currents[i] * Math.pow(1.56, i0/currents[i]);
    }
}
return w;


//方法二:
double w = 0.0, yz = 1.234567;
for (int i = pMax; i < currents.length; i++) {
    w += yz * currents[i] * Math.pow(0.89, i0/currents[i]);
}
return w;

 代码如上,现在问题就是照我的理解方法二应该比方法一快一些才对,而进行了测试方法一需要114ms,方法二需要333ms(进行了多次测试取平均)

我现在不知道到底是什么原因,所以上来请教讨论一下,谢谢各位!

- -|||  没分

0

3个回答

方法一中的循环体实际计算次数要比方法二少吧,所以就快;
算法时间主要花在了计算Math.pow和两次乘法,循环本身的时间比计算时间少很多
因为方法一有计算条件的约束所以计算时间就少花了很多

0
Joylae
拿什么来整死你 嗯,是因为之前求pMax时把+=写成=,才造成这种结果。多谢您的回答,新注册的帐号没有当天回复您实感抱歉!
接近 6 年之前 回复

方法一中的if (currents[i] > i2) 这句,满足这个条件才会进去计算。

0
Joylae
拿什么来整死你 多谢您的回答,之前提问的时候账号是新申请的,所以没能及时回复
接近 6 年之前 回复

两个方法所消耗的时间主要是用在计算上面,虽然第一个if判断比第二多,但是他真正计算的时间比第二方法少,总体来看肯定是第一个方法时间消耗少。其实你可以通过循环的次数从小到大,依次去比较两个方法消耗的时间,应该可以画出一个正太分布图。肯定会有一个临界点,两个方法的时间一样,通过这个可以分析出你想要的结果

0
Joylae
拿什么来整死你 谢谢您的回答,这么晚才回复。。是因为自己的疏忽把计算pMax的符号写错了,而造成了两个循环的次数不一样的结果。
接近 6 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!