性能与设计相关的java中的私有/受保护方法

Mar*_*tin 2 java private protected

我们正和朋友讨论java代码设计和效率问题.

他认为,出于性能原因,方法最好是私有的,以及在覆盖时最好保持类一致性.

我认为最好保护方法以获得完全的可定制性,并且一旦用户想要改变其部分行为,就应避免浪费时间修改和释放API.

我们知道组合优于继承,所以在这里我主要关注性能比较.

一个简单的测试(见下文)证明父类具有受保护方法的扩展类并不比具有私有方法的父类慢.甚至有时 (我真的不太了解性能变化)更快.

elapsed:8051733.063 microseconds for A (private)
elapsed:8036953.805 microseconds for B (protected)
Run Code Online (Sandbox Code Playgroud)

你认为下面提到的测试足够强大,可以进行比较吗?

public class VerifPerfProtected {
public static void main(String[] args) {
    int ncalls = 1000000000; //10^9
    ChildrenClassA a = new ChildrenClassA();
    ChildrenClassB b = new ChildrenClassB();

    long start = System.nanoTime();
    a.manyCalls(ncalls);
    long stop = System.nanoTime();
    System.out.println("elapsed:" + (stop - start)/1000.0 + " microseconds for A (private)");

    start = System.nanoTime();
    b.manyCalls(ncalls);
    stop = System.nanoTime();
    System.out.println("elapsed:" + (stop - start)/1000.0 + " microseconds for B (protected)");
}

public static class ParentClassA{
    public void manyCalls(int n){
        for (int i = 0; i < n; i++) {
            callAmethod();
        }
    }
    public void callAmethod(){
        aPrivateMethod();
    }
    private void aPrivateMethod(){
        int a=0;
        for (int i = 0; i < 5; i++) {
            a++;
        }
    }
}

public static class ParentClassB{
    public void manyCalls(int n){
        for (int i = 0; i < n; i++) {
            callAmethod();
        }
    }
    public void callAmethod(){
        aProtectedMethod();
    }
    protected void aProtectedMethod(){
        int a=0;
        for (int i = 0; i < 5; i++) {
            a++;
        }
    }
}

public static class ChildrenClassA extends ParentClassA{        
}

public static class ChildrenClassB extends ParentClassB{        
}
}
Run Code Online (Sandbox Code Playgroud)

Eli*_*kan 5

你认为下面提到的测试足够强大,可以进行比较吗?

坦率地说,没有.

微基准是棘手的; 这里有一个很好的讨论.就个人而言,我总是添加预热时间(例如,我运行一个方法的前x次不计入性能,让各个单身人士有机会初始化并让JIT编译器有时间去做它的魔法),我确保运行带-server开关的JVM .此外,我怀疑编译器可能足够聪明,可以删除a++操作,因为它们的结果不会消失.

但不管你标杆的正确性,我强烈认为,私有与保护方法是一个设计问题,期.两者之间可能存在的性能差异对于决定方法是私有还是受保护的决定无任何影响.