在Java中,创建对象或获取对象值是否更昂贵?

时间:2010-06-04 16:32:42

标签: java performance

所以说例如我正在经历一个'if'块,在这个块中,我将某个数字的值与常量进行比较。这样会更贵吗?

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的了解有点缺乏,所以无法提出任何建议。

非常感谢您的回答!

5 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:6)

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

您正在保存一些方法调用(在Java中它们非常有效)

差异可以忽略不计。并且编译器不可能优化这些事情。

答案 2 :(得分:3)

假设getOb()getVal()只是返回引用而不进行计算,那么这两段代码在功能上是等价的。这意味着它们之间没有明显的区别。

使用哪种形式之间的争论归结为风格和偏好的问题,以及先发优化的边界(因为你可能花费大量时间争论做出零对您的应用程序性能产生可测量的影响。)

答案 3 :(得分:2)

这实际上取决于getObj()和getVal()的实施方式。如果它们是昂贵的操作,那么是的,你的第二个例子几乎总是更快。但是,如果您只关心方法调用的开销,请不要这样做。 JIT编译器通常可以内联方法调用,即使它没有,也只需很少的开销。与本地变量在堆上的分配类似,这些操作非常快,除非您通过分析确定了性能“热点”,否则现在开始考虑哪些内容的执行速度还为时过早。

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

通常,编写代码使其首先易于理解正确。只有当你确定了明确的瓶颈时,才应该开始尝试优化速度/内存。您将通过首先编写代码清晰度来节省自己和试图维护/调试代码,时间和挫折的同事。

答案 4 :(得分:2)

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

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

反正。另外,premature optimization is the root of all evil