性能:是否应避免构造函数委派?

2022-09-03 13:40:28

我想知道从构造函数(又名构造函数委派)中运行构造函数与从构造函数中运行构造函数之间是否存在任何性能差异

请不要将这个问题解释为我支持冗余,就像复制长构造函数以提高性能一样。我理解,在大多数情况下,在构造函数中调用构造函数是可取的,原因很多,而不是性能。(例如,可读性)

例如,这是我最近创建的一个类:Vector3D

public class Vector3D {

    public final int x, y, z;

    public Vector3D() {
        this(0, 0, 0);
    }

    public Vector3D(int x, int y, int z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }
}

我不会像这样自己调用和简单地设置变量而受益吗?this(0, 0, 0)

public class Vector3D {

    public final int x, y, z;

    public Vector3D() {
        this.x = 0;
        this.y = 0;
        this.z = 0;
    }

    public Vector3D(int x, int y, int z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }
}

答案 1

您永远不会从复制代码中受益。这是过早的优化。方法调用无需任何费用,除非您在短时间内经常执行它。在这种情况下,如果代码未在系统的太多位置使用,则可以内联代码,但事实并非如此。

想象一下,有一天你为你的班级添加了另一个功能。如果内联了代码,则必须更新两个构造函数,而不是单个构造函数。所有与逻辑相关的代码位都应该在代码中相关(基本上调用相同的nethods/使用相同的类)。这就是构建可重用代码的方式。

不要过度考虑性能,首先要考虑设计,清晰度和可重用性。系统中真正需要高性能的部分是算法部分,这不应该影响设计。


答案 2

主要.java

package pokus1;

public class Main {

    public int m_a;
    public int m_b;

    public Main(int a, int b) {

        m_a = a;
        m_b = b;

    }

    public Main() {
        this(0,0);
    }

    public static void main(String[] args) {

        Main main = new Main();

    }

}

Javap output (javap -v Main.class) for pokus1.主():

您是否看到偏移量上的指令?这是对 的调用。所以从根本上说,是的,不调用第二个构造函数更有效。但是当前的JVM实现中有很多优化,比如方法内联,即时编译等,所以我认为你不需要考虑它,否则你可以考虑每个java调用,如果有必要的话。invokespecial3pokus1.Main(int a,int b)

public pokus1.Main();
    flags: ACC_PUBLIC
    Code:
      stack=3, locals=1, args_size=1
         0: aload_0       
         1: iconst_0      
         2: iconst_0      
         3: invokespecial #24                 // Method "<init>":(II)V
         6: return        
      LineNumberTable:
        line 16: 0
        line 17: 6
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0       7     0  this   Lpokus1/Main;

推荐