2010-06-04 57 views
4

所以说例如我正在经历一个'如果'块,在这个块中,我将一些数字的值与一个常量进行比较。难道是这样的更昂贵:在Java中,创建对象或获取对象值会更昂贵吗?

if(foo.getOb().getVal() == CONST_0) 
{ 
    .... 
} 
.... 
if(foo.getOb().getVal() == _CONST_N) 
{ 
    .... 
} 
else 
    .... 

OR:

int x = foo.getOb().getVal(); 
if(x == CONST_0) 
{ 
    .... 
} 
.... 
if(x == _CONST_N) 
{ 
    .... 
} 
else 
    .... 

我知道,这似乎是一个愚蠢的问题。我认为第二个实现速度更快/效率更高,但我很好奇为什么。我一直在想着最近几分钟的原因,因为我对Java的知识...有点欠缺,所以无法真正提出任何事情。

非常感谢任何答案!

+1

为您的示例生成字节码并检查引擎盖下发生了什么 – svlada 2010-06-04 16:36:56

+11

让您的编译器执行此优化。如果您花时间担心这一点,请确保您忽略了更重要的问题。 – 2010-06-04 16:39:44

回答

7

它在我看来应该使用switch语句,在这种情况下,您不必担心它。

switch (foo.getOb().getVal()) { 
    case CONST_0: 
     .... 
     break; 
    case CONST_N: 
     .... 
     break; 
    default: 
     .... 
     break; 
} 
6

这不是创建对象。您正在创建对该对象的引用。

您节省几个方法,调用(在Java中,他们是非常有效)

的差异可以忽略不计。编译器不会不太可能优化这些事情。

+1

他的'val'是'int'。所以'=='是唯一的选择。 – 2010-06-04 16:38:33

+0

a,是的,正在修复。 – Bozho 2010-06-04 16:39:09

+0

没有'x''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''不必'垃圾收集它是在堆栈上分配的原始类型。 – Justin 2010-06-04 16:51:19

3

假设getOb()getVal()只是返回引用而不做计算,那么这两个代码片断在功能上是等效的。这意味着它们之间没有真正明显的区别。

之间使用哪种形式的辩论涉及到的风格和偏好,以及先发制人的优化边界问题(因为你可能会花很多时间争论使得这对可衡量的影响的变化你的应用程序的性能)。

2

这实际上取决于如何实现getObj()和getVal()。如果他们是昂贵的操作,那么是的,你的第二个例子几乎总是会更快。但是,如果您担心方法调用的开销,请不要这样做。 JIT编译器通常可以经常内联方法调用,即使不调用,也没有多少开销。熟悉堆的局部变量分配,这些操作非常快,除非通过分析确定了性能“热点”,否则现在就开始考虑更快执行什么操作为时尚早。

有关未成熟优化的更多信息,请参阅此处:When is optimisation premature?

通常,写你的代码,这样它的容易理解正确第一。只有当你确定一个明确的瓶颈时,你才应该开始尝试优化速度/内存。您将通过首先编写代码清晰度来节省自己和试图维护/调试代码,时间和沮丧的同事。

2

示例代码违反了Law of Demeter。 它应该是

if(foo.isConst0()) 
{ 
    .... 
} 

无论如何。另外,premature optimization is the root of all evil

+0

所以,要清楚,你建议他实现foo.isConst0(),foo.isConst1(),foo.isConst2()。 。,foo.isConstN()? 看起来超级丑陋,我敢肯定只有foo.getObjVal(),然后检查值是在德米特的“法则”的限制内。 – biggusjimmus 2010-06-04 18:02:34

+1

向内部状态请求对象违反了OO。应该有有意义的名字,例如foo.isInStateBar()等。抽象的例子在这里没有多大帮助。更好地看到真正有意义的名字。 foo.isInStateBar()比foo.getObj()。getVal()== 3更好 – mhaller 2010-06-04 18:05:37