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



给定以下两种方法,为什么在DEBUG模式下复制构造函数的速度慢了大约100ms?

在一个真实的项目中,我将一堆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

我使用Stopwatch来测量创建新复制对象的每种方法的性能10000000次。Copy ctor()总是比Me.Copy().慢100毫秒

这很令人费解;有人能解释一下吗?注意:我读过ICloneable、IDeepCloneable等。但是,对于这个项目,我相信一致的copy ctor()是他们要走的路;因此,请避免重复这些建议。我只是想了解为什么copy ctor()会执行得更慢。

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

考虑到VB.NET的"普遍"使用,这不是性能,而是快速应用程序开发(R.A.D.),我认为深入研究调试模式的见解,以发现真正发生的事情,对这个特定问题或大多数类似问题都没有帮助。

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

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

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

希望这能有所帮助。

最新更新