2012-03-05 51 views
1

假设下面的代码片段:什么是在方法对象中包装静态方法调用的开销?

public class NotThatWellWrittenClass { 
    public static void doSmth() { 
     /* 
     This code part is actually irrelevant. 
     */ 
    } 
} 

其他一些类将使用UTIL如下:NotThatWellWrittenClass.do(),所以唯一的开销实际上与performing a method call

我真的不喜欢这种编程方式,所以我想重构这部分代码,而不是打破使用静态方法调用的客户端。重构代码片段:

public class NotThatWellWrittenClass { 
    public static void doSmth() { 
     new WorkUtil().doSmth(); 
    } 
} 

public class WorkUtil() { 
    public void doSmth() { 
     /* 
      This code part is actually irrelevant. 
     */ 
    } 
} 

现在,代码更加面向对象,更容易测试和重用。然而,它现在确实创建了一个额外的对象(内存分配),并执行实例方法调用,而不是静态调用(我猜,它是通过不同的JVM优化的)。

所以,回到这个问题,下面的重构提供了明显的开销吗?也许它应该以其他方式执行? (我总是可以将一个实例缓存到我的对象,但这是否值得?)

我想深入解释一下,谢谢。

+2

我从未注意到由此造成的任何开销。主要是因为在几乎每一段代码中都存在着更大的算法问题,不稳定的编码位和性能/ OO权衡。但是,如果您真的担心,请将您的方法和课程声明为“final”,这会给VM提示它不需要进行虚拟呼叫。 – biziclop 2012-03-05 10:50:58

回答

0

方法是小的,例如,长度为35个字节,可以内联。

这种方法只对经常调用的方法进行优化。例如10,000次以上。

如果它很少被调用,它应该很重要,无论如何它需要几个纳秒。

如果WorkUtil.do()足够简单,则可以优化对象分配。唯一的选择是自己回收对象。你真的需要这样做是相当罕见的。

public class NotThatWellWrittenClass { 
    private static final WorkUtil THE_WORK_UTIL = new WorkUtil(); 
    public static void do() { 
     // could introduce thread safety issues as the object is now shared. 
     THE_WORK_UTIL.do(); 
    } 
} 
+0

那些静态方法可能相当大,我不能对它们的复杂性作出任何假设。另外 - 由于它是静态方法,我不能确定它不会以不好的方式被调用,例如每秒1k次。 我只是在寻求一般的方法,不管这个重构是否是一个好的做法。 – 2012-03-05 10:53:28

+0

@ŁukaszBachman您是否编码图书馆或最终产品?如果它是最终产品,您可以完全控制它被调用的次数。此外,如果方法本身不仅仅是简单的操作,任何开销都会产生较小的影响。 – biziclop 2012-03-05 11:03:37

+0

最终产品,我知道我可以分析源代码,看看它是如何被使用的,但是由于我是开发团队的新手,我不能保证有人没有在其他子项目中使用这种util方法。 – 2012-03-05 11:52:35

相关问题