Vb.net 为什么复制构造函数比我快。copy()?

Vb.net 为什么复制构造函数比我快。copy()?,vb.net,Vb.net,给出以下两种方法,为什么在调试模式下复制构造函数会慢100毫秒 在一个实际项目中,我将一组deep Copy()方法转换为相应的Copy ctor(),发现Copy ctor()的性能比以前的deep Copy()方法差 我检查了IL,他们看起来很像我 Public Sub New(ByVal pClass1 As Foo) A = pClass1.A B = pClass1.B C = pClass1.C D = pClass1.D E = pClass

给出以下两种方法,为什么在调试模式下复制构造函数会慢100毫秒

在一个实际项目中,我将一组deep Copy()方法转换为相应的Copy ctor(),发现Copy ctor()的性能比以前的deep 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
我使用秒表来测量创建新复制对象10000000次的每种方式的性能。Copy ctor()总是比我慢100毫秒。Copy()


这是相当令人费解的;有人能解释一下吗?注意:我读过关于iClonable、IDeepCloneable等的文章。但是,对于这个项目,我确信consistent copy ctor()是它们的发展方向;因此,请避免重复这些建议。我只是想了解为什么copy-ctor()会执行得较慢。

根据您的评论和测试,您可以看到,您只能假设copy构造函数仅在VS-debug模式下执行得较慢。因此,您的问题本身无法得到回答,但是值得一提的是,VisualStudio中的发布模式和调试模式之间存在差异,请看一看示例。最重要的区别是在发布模式下在最终二进制文件中进行的优化

考虑到VB.NET的“通用”用途,它不是性能,而是快速应用程序开发(R.A.D.),我认为对调试模式进行深入研究,以发现真正发生的事情,对这个特定问题或最类似的问题没有帮助

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

毕竟,在这些操作中的性能是应用程序中的一个重要因素,一些标准函数不符合您的需求,那么您应该分离对象库并使用C++创建所需的对象操作操作。我不是这个领域的专家,但我在很多地方都见过这种技术,比如

我知道这并不能准确地回答您的问题,而且主要是基于观点,但我认为作为VB.NET开发人员,我们不应该太在意非常具体的操作的性能,而不是应用程序的整体性能。例如,如果我们将持续3分钟的报告操作缩短到2分45秒(如果你知道我的意思的话),那么报告操作不会更好


希望这能有所帮助。

也许是因为类的构造函数有一些简单方法没有的开销?100ms是单个迭代还是整个迭代循环的差异?为什么在调试模式下测量?在我的复制构造函数中,速度比复制函数快,您能否提供更多关于如何在您的问题中进行测试的详细信息?Thanks@Steve100毫秒用于整个1000万次迭代。对于这个简化的例子来说,这并不多,但在现实世界的应用程序中,差异是显著的。@Christos这是我的。NET fiddler提出了
复制构造函数花费:4524ms复制函数花费:4531ms
但在VS2017中
复制ctor花费1428 Copy()花费1380
在调试模式下,复制ctor花费139 Copy()花费139在发布模式下。