0

我想知道以下两者之间是否有任何性能差异?

if(i>=0){
    //some code here
}

//and

if(i>-1){
    //some code here
}

那么下面两个呢?

if(i>=0){
    //some code here
}

//and

if(i>0 || i==0){
    //some code here
}

是否>= 会在内部转换为> || ==?

PS 性能差异会很小,可以忽略不计,但我想知道是否有任何性能差异?

4

5 回答 5

2

在现代 JVM 上,我认为这种想法毫无意义。JVM 不只是编译代码并停止。它在运行时了解您的代码并相应地修改其行为。现在我不是编译器专家,但据我了解,JVM 可以非常聪明,if如果它看到i始终评估为真或假的价值,它基本上可以在运行时优化你的整个语句。

每当您想以这样的微观方式“优化”您的代码时,请停下来提醒自己,您不如 JVM 聪明,因为它会作弊。它可以实际查看您的代码在运行时所做的事情并相应地更改其行为。

查看 Steve Yegge 的演讲中出色的成绩单,它暗示了 VM 可以有多么令人印象深刻。这是几年前的事了!

http://steve-yegge.blogspot.com/2008/05/dynamic-languages-strike-back.html

添加了更好的示例

这些是 Josh Bloch 的演讲中的幻灯片,他谈到现在微基准测试是不可能的。您无法查看源代码行并知道 JVM 在运行时会做什么。我最喜欢的幻灯片是短路操作员&&过去总是更快,但在现代硬件上,这不再总是正确的了。完全违反直觉,这意味着您应该停止尝试走这条路。

http://wiki.jvmlangsummit.com/images/1/1d/PerformanceAnxiety2010.pdf

于 2012-07-24T04:20:48.220 回答
1

答案将取决于平台;即它将取决于您的Java 安装中的硬件平台、ISA 和JIT 编译器。

这使得知道答案变得毫无意义......因为您不想浪费时间为特定的硬件/ISA/JIT编译器平台进行微优化。

但是,如果您确实需要知道,那么您应该对其进行基准测试……注意做所有您需要做的事情,以便从 Java 基准测试中获得有效的结果。


FWIW - 我认为现代 JIT 编译器将在所有两种情况下为子案例生成等效的本机代码;即它应该对您使用的性能没有影响。但这i>0 || i==0是毫无意义的混淆,因此应该避免。

于 2012-07-24T04:08:34.877 回答
0

它依赖于实现,因此如果您真的关心,您需要针对您的特定平台进行基准测试。

话说回来:

  • 前两个在任何合理的现代硬件/JVM 组合上可能是等效的。所有比较往往在现代硬件上执行相同。
  • 对于后两个,第一个选项可能更快。虽然一个聪明的编译器会发现等价性并产生相同的单一本地操作,但我相信一些当前的 JIT 编译器不会发现这一点。但是无论如何您都应该使用第一个选项,因为它更易于阅读和维护。
于 2012-07-24T04:54:53.343 回答
0

您可以使用 来检查相应的汇编代码objdump,或检查在运行时实际退出的指令数。但是,对于流水线,所需的实际周期可能并不那么清楚。

于 2012-07-24T04:01:48.203 回答
0

我相信第一种方法更好。

第二个需要3个比较:

  1. if (i > 0)
  2. if (i == 0)
  3. 1. 和 2 的布尔 OR。

但是,实际结果仍然取决于编译器是否能够将 2 个代码优化为相同(因为它们正在做同样的事情)。

也许基准是一个更好的主意。

于 2012-07-24T03:58:57.857 回答