在方法对象中包装静态方法调用的开销是多少?

时间:2012-03-05 10:46:51

标签: java jvm

我们假设以下代码片段:

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优化的。)

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

我想得到一些深入的解释,谢谢。

1 个答案:

答案 0 :(得分: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();
   }
}