以非静态方式访问方法是否会影响/获益?

时间:2014-08-27 22:29:16

标签: java performance static

假设这里的所有方法调用都是静态的,如下所示:

public class Util {
    public static void method1() {
    }
}

以静态方式访问:

Util.method1();
Util.method2();
Util.method3();

以非静态方式访问

Util util = new Util();
util.method1();
util.method2();
util.method3();

两种方式都有任何性能差异吗?我知道这样做的第一种方法是正确访问它。但第二种方法只实例化一次util对象而不是三次。除了正确访问这些方法之外,我找不到任何指向任何东西的东西。据我所知,没有功能差异,但存在逻辑差异。如果有人知道的话,寻找任何一种方式的成本与收益。

2 个答案:

答案 0 :(得分:12)

  

两种方式都有任何性能差异吗?

是的 - 由于构建了一个毫无意义的实例,第二个稍慢。

  

我知道这样做的第一种方法是正确访问它。但第二种方法只实例化一次util对象而不是三次。

不,第二种方式创建Util的一个实例,而第一种方式不创建任何实例。

第一种方式显着更好,因为它清楚地表明它一个静态方法。请考虑以下代码:

Thread t = new Thread(someRunnable);
t.start();
t.sleep(1000);

最后一次通话看起来像什么?肯定会让新线程睡觉,对吧?不......它只是调用Thread.sleep(),它只会使当前线程休眠。

当您修改静态方法调用以“通过”引用时,引用的值将被完全忽略 - 它甚至可以为null:

Util util = null;
util.method1(); // This will still work...

答案 1 :(得分:0)

您显示的代码没有区别,因为所有这些方法都是静态的。 (但编译器会为第二组发出警告。)我认为静态方法有一个小的性能优势。我认为静态访问的基础字节代码invokeSpecial应该比invokeVirtual更快,后者必须进行某种类型的解码。

但是担心这还不够。使用适合您设计的任何类型的方法(静态与实例)。不要试图像这样优化方法调用。