Timing Split; getting a handle on things.
Tonight I decided that, before I attempt to match the speed of Split, I'd better measure it out to see how fast it is. Here's the results of some simple tests...
Imports System.Text Imports Microsoft.VisualBasic
Module StringTimers Private mString As String Private startTime, endTime As DateTime
Sub Main() ' initialize a test string InitializeString()
' Test the VB Split Function Console.WriteLine("========== DoFunction() ==========") DoFunction() DisplayTime("DoFunction()") DoFunction() DisplayTime("DoFunction()") DoFunction() DisplayTime(vbCrLf & "DoFunction()")
' Test the String instance method Split Console.WriteLine(vbCrLf & vbCrLf & "========== DoMethod() ==========") DoMethod() DisplayTime("DoMethod()") DoMethod() DisplayTime("DoMethod()") DoMethod() DisplayTime(vbCrLf & "DoMethod()")
' Test a Regex who's pattern has been internalized prior to timing Console.WriteLine(vbCrLf & vbCrLf & "========== DoRegex_Compiled() ==========") DoRegex_Compiled() DisplayTime("DoRegex_Compiled()") DoRegex_Compiled() DisplayTime("DoRegex_Compiled()") DoRegex_Compiled() DisplayTime(vbCrLf & "DoRegex_Compiled()")
' Test a Regex who's pattern in internalized during timing Console.WriteLine(vbCrLf & vbCrLf & "========== DoRegex_AdHoc() ==========") DoRegex_AdHoc() DisplayTime("DoRegex_AdHoc()") DoRegex_AdHoc() DisplayTime("DoRegex_AdHoc()") DoRegex_AdHoc() DisplayTime(vbCrLf & "DoRegex_AdHoc()")
Console.ReadLine() End Sub Private Sub InitializeString() Dim sb As New StringBuilder For i As Integer = 0 To 100000 sb.Append("a b c d" & vbCrLf) Next mString = sb.ToString End Sub ' Test the VB Split Function Private Sub DoFunction() Console.WriteLine("Entering DoFunction()...") startTime = DateTime.Now() Dim arr As String() = Split(mString, vbCrLf) endTime = DateTime.Now() End Sub ' Test the String instance method Split Private Sub DoMethod() Console.WriteLine("Entering DoMethod()...") startTime = DateTime.Now() Dim arr As String() = mString.Split(New Char() {Chr(13), Chr(10)}) endTime = DateTime.Now() End Sub ' Test a Regex who's pattern has been internalized prior to timing Private Sub DoRegex_Compiled() Console.WriteLine("Entering DoRegex_Compiled...") Dim re As New RegularExpressions.Regex("[\n\r]+", _ RegularExpressions.RegexOptions.Compiled Or RegularExpressions.RegexOptions.Singleline) startTime = DateTime.Now() Dim arr As String() = re.Split(mString) endTime = DateTime.Now() End Sub ' Test a Regex who's pattern in internalized during timing Private Sub DoRegex_AdHoc() Console.WriteLine("Entering DoRegex_AdHoc...") startTime = DateTime.Now() Dim arr As String() = RegularExpressions.Regex.Split(mString, "[\n\r]+") endTime = DateTime.Now() End Sub ' Helper method to display results to the console Private Sub DisplayTime(ByVal operationName As String) Console.WriteLine(operationName & " took " & _ endTime.Subtract(startTime).TotalMilliseconds.ToString & " milliseconds.") End Sub End Module
...and here's the output...
========== DoFunction() ========== Entering DoFunction()... DoFunction() took 4947.1136 milliseconds. Entering DoFunction()... DoFunction() took 4927.0848 milliseconds. Entering DoFunction()... DoFunction() took 4927.0848 milliseconds. ========== DoMethod() ========== Entering DoMethod()... DoMethod() took 50.072 milliseconds. Entering DoMethod()... DoMethod() took 40.0576 milliseconds. Entering DoMethod()... DoMethod() took 60.0864 milliseconds. ========== DoRegex_Compiled() ========== Entering DoRegex_Compiled... DoRegex_Compiled() took 460.6624 milliseconds. Entering DoRegex_Compiled... DoRegex_Compiled() took 440.6336 milliseconds. Entering DoRegex_Compiled... DoRegex_Compiled() took 480.6912 milliseconds. ========== DoRegex_AdHoc() ========== Entering DoRegex_AdHoc... DoRegex_AdHoc() took 981.4112 milliseconds. Entering DoRegex_AdHoc... DoRegex_AdHoc() took 1051.512 milliseconds. Entering DoRegex_AdHoc... DoRegex_AdHoc() took 971.3968 milliseconds.