为什么复制构造函数比Me.Copy()快?

时间:2018-12-28 10:07:40

标签: vb.net

给出以下两种方法,为什么在DEBUG模式下将复制构造函数的速度降低100ms?

我在实际项目中将一堆深层Copy()方法转换为相应的副本ctor(),发现副本ctor()的性能比早期的深层Copy()方法差。

我检查了IL,它们似乎与我非常相似。

Public Sub New(ByVal pClass1 As Foo)
    A = pClass1.A
    B = pClass1.B
    C = pClass1.C
    D = pClass1.D
    E = pClass1.E
    F = pClass1.F
    G = pClass1.G
    H = pClass1.H
    I = pClass1.I
    J = pClass1.J
    K = pClass1.K
    L = pClass1.L
    M = pClass1.M
    N = pClass1.N
    O = pClass1.O
    P = pClass1.P
    Q = pClass1.Q
    R = pClass1.R
    S = pClass1.S
    T = pClass1.T
    U = pClass1.U
    V = pClass1.V
    W = pClass1.W
    X = pClass1.X
    Y = pClass1.Y
    Z = pClass1.Z

    TheOther = If(pClass1.TheOther Is Nothing, Nothing, New Foo(pClass1.TheOther))
End Sub

Public Function Copy() As Foo
    Dim obj As Foo = New Foo()

    obj.A = A
    obj.B = B
    obj.C = C
    obj.D = D
    obj.E = E
    obj.F = F
    obj.G = G
    obj.H = H
    obj.I = I
    obj.J = J
    obj.K = K
    obj.L = L
    obj.M = M
    obj.N = N
    obj.O = O
    obj.P = P
    obj.Q = Q
    obj.R = R
    obj.S = S
    obj.T = T
    obj.U = U
    obj.V = V
    obj.W = W
    obj.X = X
    obj.Y = Y
    obj.Z = Z

    obj.TheOther = If(TheOther Is Nothing, Nothing, TheOther.Copy())

    Return obj
End Function

我正在使用秒表来衡量10,000,000次创建新副本对象的每种方式的性能。复制ctor()总是比Me.Copy()慢100毫秒。

这很令人困惑;有人可以阐明这一点吗?注意:我已经阅读了有关ICloneable,IDeepCloneable等的信息。但是,对于该项目,我确信一致的副本ctor()是可行的方法。因此,请避免重复这些建议。我只是想了解为什么复制ctor()的性能会变慢。

1 个答案:

答案 0 :(得分:1)

根据您的评论和测试,您可以看到只能假设复制构造函数仅在VS调试模式下较慢。因此,您的问题本身无法得到解答,但是值得一提的是,以Visual Studio为例,here的发布和调试模式之间是有区别的。最重要的区别是在发布模式下最终二进制文件中进行了优化。

考虑VB.NET的“通用”用途不是性能,而是快速的应用程序开发(RAD),我不认为对调试模式有深入的研究,以发现真正的问题。发生,将有助于解决此特定问题或大多数类似问题。

因此,我建议使用复制构造函数,不仅因为我们的测试表明它实际上更快,而且最重要(在我看来),因为作为一种技术,它比复制函数更清晰,更“整洁”。 / p>

毕竟,如果这类操作的性能是应用程序中的重要因素,而某些标准功能(如MemberwiseClone)无法满足您的需求,则应分离对象库并使用C ++创建所需的对象操纵操作。我不是该领域的专家,但是我已经在here等不同地方看到了该技术。

我知道这并不能完全回答您的问题,它主要是基于观点的,但是我认为作为VB.NET开发人员,我们不应该因为非常具体的操作而不是整体性能而受到太多困扰。应用程序。例如,如果我们将报告时间缩短为2分45秒(如果您知道我的意思)的话,那么持续3分钟的报告操作将再好不过了。

希望这会有所帮助。