1,000,000 個のオブジェクトのコレクションを使用して、各メソッドのパフォーマンスをテストすることにしました。オブジェクトは、整数、クラス、Nothing、または DBNull.Value のいずれかでした。各テストには同じコレクションが使用され、各メソッドを 50 回テストしました。
"" & x
これは実際にはすべてのオブジェクトで機能するわけではありません。DBNull.Value および Nothing に対しては機能しますが、このメソッドを古いオブジェクトだけで使用しようとすると、InvalidCastException が発生します。興味深いことに、CStr(DBNull.Value) は InvalidCastException をスローするため、なぜ機能するのかわかりません。
カスタム オブジェクトを使用した結果:該当なし
カスタム オブジェクトを使用しない
結果: 平均126.7 ミリ秒、中央値126 ミリ秒
If(x, "").ToString()
カスタム オブジェクトを使用した結果: 平均140.46 ミリ秒、中央値138 ミリ秒
カスタム オブジェクトを使用しない
結果: 平均69.32 ミリ秒、中央値69 ミリ秒
Convert.ToString()
カスタム オブジェクトを使用した結果: 平均171.54 ミリ秒、中央値171 ミリ秒
カスタム オブジェクトを使用しない
結果: 平均112.14 ミリ秒、中央値112 ミリ秒
If(x, "").ToString()
そのため、非常に大きなレコードのセットでは少し高速に見えますが、Convert.ToString()
のより強力な変換オプションとのバランスを取る必要があります。答えてくれてありがとう。
テストに使用したコードは次のとおりです。
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