给出以下两种方法,为什么在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()的性能会变慢。
答案 0 :(得分:1)
根据您的评论和测试,您可以看到只能假设复制构造函数仅在VS调试模式下较慢。因此,您的问题本身无法得到解答,但是值得一提的是,以Visual Studio为例,here的发布和调试模式之间是有区别的。最重要的区别是在发布模式下最终二进制文件中进行了优化。
考虑VB.NET的“通用”用途不是性能,而是快速的应用程序开发(RAD),我不认为对调试模式有深入的研究,以发现真正的问题。发生,将有助于解决此特定问题或大多数类似问题。
因此,我建议使用复制构造函数,不仅因为我们的测试表明它实际上更快,而且最重要(在我看来),因为作为一种技术,它比复制函数更清晰,更“整洁”。 / p>
毕竟,如果这类操作的性能是应用程序中的重要因素,而某些标准功能(如MemberwiseClone)无法满足您的需求,则应分离对象库并使用C ++创建所需的对象操纵操作。我不是该领域的专家,但是我已经在here等不同地方看到了该技术。
我知道这并不能完全回答您的问题,它主要是基于观点的,但是我认为作为VB.NET开发人员,我们不应该因为非常具体的操作而不是整体性能而受到太多困扰。应用程序。例如,如果我们将报告时间缩短为2分45秒(如果您知道我的意思)的话,那么持续3分钟的报告操作将再好不过了。
希望这会有所帮助。