Java 代码比较与性能

Java 代码比较与性能,java,performance,Java,Performance,在高性能库实现中,我看到了以下代码 double meanQ=0; int counter=0; for(...){ //some cycle with many iterations where meanQ and counter are incremented } meanQ /= (double)counter + 0.001D; 最后一行对我来说很混乱。我会的 if(counter>0) meanQ /= counter; 当计数器为0时,则meanQ也为0,

在高性能库实现中,我看到了以下代码

double meanQ=0; 
int counter=0;
for(...){
    //some cycle with many iterations where meanQ and counter are incremented
}
meanQ /= (double)counter + 0.001D;
最后一行对我来说很混乱。我会的

if(counter>0)
    meanQ /= counter;
计数器
0
时,则
meanQ
也为
0
,否则它将被
计数器
除以。作为一个平均值,它也(稍微)更准确,没有类型转换,更容易理解。好吧,
if
和sum应该有类似的性能,但是我现在不能在我的机器上测试

这两种方法有什么区别吗?当前库版本是否性能更好,或者是否有其他动机选择它而不是我的建议?

如果
meanQ/=(双)计数器+0.001D在循环中,则此代码比使用后一个代码更快:

 if(counter>0)
    meanQ /= counter;  
在循环中

这是因为,对于每次迭代,它都需要检查计数器中的0,而使用if()将产生很大的不同


sum()和if()的复杂度将不同。

好吧,这里绝对不需要强制转换。int+double总是给出一个double。D后缀也是多余的。这根本不鼓励对库质量的信任:-)尝试正确的解决方案(
if…
)并对两个版本进行基准测试。它有什么不同吗?这里没有,因为与循环相比,性能可以忽略不计。我最想得到的答案是供将来参考。但是,我没有一台机器在atm上测试它,所以我无法对浮点运算(特别是双精度运算)进行基准测试,因此我认为你错了。我相信在现代处理器上,浮点运算并不慢,存在每个周期执行4或8个浮点运算的向量寄存器。除非设备的资源真的很有限,比如嵌入式系统,否则与之相比,if()在性能下降方面会更为显著,imho。不过,它不属于
if
。为了清晰起见,我对问题进行了编辑。此外,即使假设浮点运算与常规运算一样快,我也假设由于分支预测,
if
也会有类似的性能。虽然这一点只是假设性的:PSorry,但我不能同意你说的“这段代码更好”。它可能更快,但结果是错误的。