Ich beschloss, die Leistung jeder Methode mit einer Sammlung von 1.000.000 Objekten zu testen. Die Objekte waren: eine Ganzzahl, eine Klasse, Nothing oder DBNull.Value. Die gleiche Sammlung wurde für jeden Test verwendet, und ich testete jede Methode 50 Mal.
"" & x
Dies funktioniert nicht für alle Objekte. Es funktioniert für DBNull.Value und Nothing, aber wenn Sie versuchen, diese Methode nur mit einem beliebigen Objekt zu verwenden, wird eine InvalidCastException ausgelöst. Interessanterweise löst CStr (DBNull.Value) eine InvalidCastException aus, weshalb ich mir nicht sicher bin, warum das funktioniert.
Ergebnisse mit benutzerdefinierten Objekt: N/A
Ergebnisse w/o benutzerdefiniertes Objekt: avg 126,7 ms, Median 126 ms
If(x, "").ToString()
Ergebnisse mit benutzerdefinierten Objekt: avg 140,46 ms, Median 138 ms
Ergebnisse ohne benutzerdefiniertes Objekt: Durchschnitt 69,32 ms, Median 69 ms
Convert.ToString()
Ergebnisse mit benutzerdefinierten Objekt: avg 171,54 ms, Median 171 ms
Ergebnisse w/o individuelle Objekt: avg 112,14 ms, Median 112 ms
So scheint es, dass If(x, "").ToString()
ist ein bisschen schneller für eine sehr große Reihe von Datensätzen, aber das müsste mit Convert.ToString()
mehr Leistung ausgeglichen werden rful Umrechnungsoptionen. Danke für die Antworten.
Hier ist der Code, den ich für den Test verwendet:
Option Strict Off
Module Module1
Sub Main()
Dim l_objectArray = Enumerable.Range(0, 1000000).Select(Function(x) GetObject(x)).ToArray()
Dim l_stopWatch As New Stopwatch()
Dim l_testResults As New List(Of Long)
Dim l_testIterations As Integer = 50
Dim l_displayValue As String
Do
' --------------------
'Console.WriteLine()
'Console.WriteLine("Conversion using string concatenation")
'l_testResults.Clear()
'For iteration = 0 To l_testIterations - 1
' l_stopWatch.Start()
' For Each o In l_objectArray
' l_displayValue = "" & o
' Next
' l_stopWatch.Stop()
' l_testResults.Add(l_stopWatch.ElapsedMilliseconds)
' l_stopWatch.Reset()
'Next
'Console.WriteLine()
'Console.WriteLine("Average: " & l_testResults.Average())
'Console.WriteLine("Median: " & GetMedian(l_testResults.ToArray()))
' --------------------
Console.WriteLine()
Console.WriteLine("Conversion using Object.ToString()")
l_testResults.Clear()
For iteration = 0 To l_testIterations - 1
l_stopWatch.Start()
For Each o In l_objectArray
l_displayValue = If(o, "").ToString()
Next
l_stopWatch.Stop()
l_testResults.Add(l_stopWatch.ElapsedMilliseconds)
l_stopWatch.Reset()
Next
Console.WriteLine()
Console.WriteLine("Average: " & l_testResults.Average())
Console.WriteLine("Median: " & GetMedian(l_testResults.ToArray()))
' --------------------
Console.WriteLine()
Console.WriteLine("Conversion using Convert.ToString(x)")
l_testResults.Clear()
For iteration = 0 To l_testIterations - 1
l_stopWatch.Start()
For Each o In l_objectArray
l_displayValue = Convert.ToString(o)
Next
l_stopWatch.Stop()
l_testResults.Add(l_stopWatch.ElapsedMilliseconds)
l_stopWatch.Reset()
Next
Console.WriteLine()
Console.WriteLine("Average: " & l_testResults.Average())
Console.WriteLine("Median: " & GetMedian(l_testResults.ToArray()))
' --------------------
Console.WriteLine()
Console.Write("Exit? (y/n): ")
Dim l_key = Console.ReadKey(False)
If l_key.Key = ConsoleKey.Y Then
Exit Sub
End If
Loop
End Sub
Private Function GetMedian(ByVal values As Long()) As Long
Array.Sort(values)
If values.Length Mod 2 = 0 Then
Return (values(values.Length/2) + values(values.Length/2 - 1))/2
Else
Return values(CInt(Math.Floor(values.Length/2)))
End If
End Function
Private Function GetObject(ByVal someNumber As Integer) As Object
Select Case someNumber Mod 4
Case 0
Return someNumber
Case 1
Return New SomeClass(someNumber)
'Return Nothing
Case 2
Return DBNull.Value
Case Else
Return Nothing
End Select
End Function
Private Class SomeClass
Private _seed As Integer
Public Sub New(ByVal seed As Integer)
_seed = seed
End Sub
Public Overrides Function ToString() As String
Return _seed.ToString()
End Function
End Class
End Module
Wissen Sie, ob dies empfohlenen Standard von Microsoft? Gibt es irgendeine Idee, was, wenn überhaupt, Overhead gegenüber den anderen beiden Methoden eingeführt wird? Ich bin nicht viel von einem CLR-Ninja, also kann ich sie nicht wirklich auf Byte-Code-Ebene vergleichen. – JDB
Ich denke, dass im Hinblick auf die Leistung Dinge nicht sinnvoll ändern, ist es besser, sicherer zu sein. –
Danke - das war die hilfreichste Antwort. Ich fügte eine Antwort mit meinen Testergebnissen hinzu und bestätigte im Grunde Ihren Vorschlag. – JDB