更多的方法意味着代码性能较差吗?

时间:2014-06-21 09:16:37

标签: java jit

更多方法,即使它们未被调用,也会对特定类的性能产生影响......

通过性能,我的意思是什么,比如创建对象需要更长的时间,实际执行方法需要更长的时间......等等......

现在我的理解是代码只有在JIT编译器到达之前没有达到的代码块/方法时才会被编译...这会让我认为我没有通过添加默认值来影响任何东西方法。是的,它会增加(字节)代码的“大小”,但实际上不会影响性能吗?

我是对还是错?

以下是示例:

public interface MyInterface {
    void someMethod();

    public default void myDefaultMethod() {
        System.out.println("hey");
    }
}

public class MyClass implements MyInterface {

    public void someMethod() {
    }
}

public static void main(String[] args) {
    MyClass c = new MyClass();
    c.someMethod();
    c.myDefaultMethod();
}

如果我然后更改MyInterface并添加许多默认方法,即使它们从未被调用过,它是否会产生影响:

public interface MyInterface {
    void someMethod();

    public default void myDefaultMethod() {
        System.out.println("hey");
    }

    public default void myDefaultMethod1() {
        System.out.println("hey1");
    }

    public default void myDefaultMethod2() {
        System.out.println("hey1");
    }

    // ...

    public default void myDefaultMethod100() {
        System.out.println("hey100");
    }
}

1 个答案:

答案 0 :(得分:1)

从某种意义上说,你是对的。但是有一些细微差别。

  

更多方法,即使它们未被调用,也会对特定类的性能产生影响......

“性能”通常指的是程序的执行速度。永远不会执行的代码永远不会(直接)占用任何CPU时间。因此,从未执行的代码不能(直接)影响执行时间。所以从这个意义上说,你是对的。

  

通过性能,我的意思是什么,比如创建对象需要更长的时间,实际执行方法需要更长的时间......等等......

不,不。没有理由让额外的方法影响对象创建时间,因为这是对象大小的函数,并且至少在Java对象中,如果内存服务,则不直接包含它们的方法。有额外的方法肯定不会(直接)影响不相关方法的执行。

  

现在我的理解是代码只有在JIT编译器到达之前没有达到的代码块/方法时才会编译...

这不完全正确。如果JITC确定这样做有益,JITC可以一遍又一遍地重新访问相同的代码段。

  

...这会让我认为我不会通过添加默认方法来影响任何事情。是的,它会增加(字节)代码的“大小”,但实际上不会影响性能吗?

你是对的,字节码文件会更大。你错了,这不会有所作为。

代码大小会对性能产生重大影响。大部分/完全适合缓存的小程序将比较大的程序具有明显的优势,因为不需要从RAM或HDD / SSD加载代码片段,这些代码很多慢于缓存。

但是,执行此操作所需的代码量可能非常大,因此对于一两个方法来说,这可能并不重要。我不确定Java中的代码大小到底会成为什么问题。从未试图找出答案。

如果你从不调用这些方法,那么组成这些方法的代码可能永远不会被加载,从而消除了与缓存相关的性能损失。我不确定是否可以分割这样的程序代码。


所以最后,它可能没有害处,只要你没有过多的方法。但是,永远不会调用具有该方法的方法,这可能是代码可维护性的问题,这始终是您应该考虑的因素。