2012-07-24 58 views
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 
} 

>=将内部转换为> || ==

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

+0

在每秒数百万CPU动作的时代,保存一个动作的动机是什么? – alfasin 2012-07-24 03:58:22

+0

@alfasin - 对性能的痴迷就像火车发现 - 很难解释:-) – 2012-07-24 04:12:19

回答

0

我相信第一种方法更好。

第二个要求3周的比较:

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

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

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

0

您可以使用objdump来检查相应的汇编代码,或者检查在运行时实际退出的指令数量。但是,对于管道,所需的实际周期可能不那么明确。

1

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

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

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


FWIW - 我认为一个现代的JIT编译器将在这两种情况下为子类生成相同的本机代码;也就是说,对于您使用哪一个应该没有什么不同。但i>0 || i==0是毫无意义的混淆,应该避免出于这个原因。

2

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

只要你觉得像这样用微型方式“优化”你的代码,只需停下来并提醒自己,你不像JVM那么聪明,因为它会被欺骗。它实际上可以看到代码在运行时的功能,并相应地改变其行为。

查看Steve Yegge的演讲中的优秀成绩单,它提供了一个虚拟机可以令人印象深刻的提示。而这是几年前现在!

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

新增更好的例子

这些都是由乔希布洛赫谈话谈论现在如何标杆微是不可能的幻灯片。您无法查看源代码行,并知道JVM在运行时会做什么。我最喜欢的幻灯片是&&这样的短路电路运营商以前总是比较快,但在现代硬件上,这种情况并非总是如此。完全反直觉,这意味着你应该停止尝试走这条路。

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

0

这是实现相关的,所以你需要基准您的特定平台,如果你真的关心。

说了:

  • 前两个是等价的任何合理的现代硬件/ JVM组合可能。所有的比较都倾向于在现代硬件上执行相同的操作。
  • 对于第二个第二个选项是可能是更快。虽然聪明的编译器会发现等价并产生相同的本地操作,但我相信一些当前的JIT编译器不会发现这一点。但是,无论如何,您应该使用第一个选项,因为阅读和维护要清晰得多。