更多方法,即使它们未被调用,也会对特定类的性能产生影响......
通过性能,我的意思是什么,比如创建对象需要更长的时间,实际执行方法需要更长的时间......等等......
现在我的理解是代码只有在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");
}
}
答案 0 :(得分:1)
从某种意义上说,你是对的。但是有一些细微差别。
更多方法,即使它们未被调用,也会对特定类的性能产生影响......
“性能”通常指的是程序的执行速度。永远不会执行的代码永远不会(直接)占用任何CPU时间。因此,从未执行的代码不能(直接)影响执行时间。所以从这个意义上说,你是对的。
通过性能,我的意思是什么,比如创建对象需要更长的时间,实际执行方法需要更长的时间......等等......
不,不。没有理由让额外的方法影响对象创建时间,因为这是对象大小的函数,并且至少在Java对象中,如果内存服务,则不直接包含它们的方法。有额外的方法肯定不会(直接)影响不相关方法的执行。
现在我的理解是代码只有在JIT编译器到达之前没有达到的代码块/方法时才会编译...
这不完全正确。如果JITC确定这样做有益,JITC可以一遍又一遍地重新访问相同的代码段。
...这会让我认为我不会通过添加默认方法来影响任何事情。是的,它会增加(字节)代码的“大小”,但实际上不会影响性能吗?
你是对的,字节码文件会更大。你错了,这不会有所作为。
代码大小会对性能产生重大影响。大部分/完全适合缓存的小程序将比较大的程序具有明显的优势,因为不需要从RAM或HDD / SSD加载代码片段,这些代码很多慢于缓存。
但是,执行此操作所需的代码量可能非常大,因此对于一两个方法来说,这可能并不重要。我不确定Java中的代码大小到底会成为什么问题。从未试图找出答案。
如果你从不调用这些方法,那么组成这些方法的代码可能永远不会被加载,从而消除了与缓存相关的性能损失。我不确定是否可以分割这样的程序代码。
所以最后,它可能没有害处,只要你没有过多的方法。但是,永远不会调用具有该方法的方法,这可能是代码可维护性的问题,这始终是您应该考虑的因素。