Это мое решение:
Public Shared Function FastSplit(inputString As String, separator As String) As String()
Dim kwds(1) As String
Dim k = 0
Dim tmp As String = ""
For l = 1 To inputString.Length - 1
tmp = Mid(inputString, l, 1)
If tmp = separator Then k += 1 : tmp = "" : ReDim Preserve kwds(k + 1)
kwds(k) &= tmp
Next
Return kwds
End Function
Вот версия с бенчмаркингом:
Public Shared Function FastSplit(inputString As String, separator As String) As String()
Dim sw As New Stopwatch
sw.Start()
Dim kwds(1) As String
Dim k = 0
Dim tmp As String = ""
For l = 1 To inputString.Length - 1
tmp = Mid(inputString, l, 1)
If tmp = separator Then k += 1 : tmp = "" : ReDim Preserve kwds(k + 1)
kwds(k) &= tmp
Next
sw.Stop()
Dim fsTime As Long = sw.ElapsedTicks
sw.Start()
Dim strings() As String = inputString.Split(separator)
sw.Stop()
Debug.Print("FastSplit took " + fsTime.ToString + " whereas split took " + sw.ElapsedTicks.ToString)
Return kwds
End Function
Вот некоторые результаты для сравнительно небольших строк, но с различными размерами, до 8 КБ блоков. (времена в тиках)
FastSplit занял 8, тогда как сплит занял 10
FastSplit занял 214, тогда как сплит занял 216
FastSplit занял 10, тогда как сплит занял 12
FastSplit занял 8, тогда как сплит взял 9
FastSplit занял 8, тогда как сплит занял 10
FastSplit занял 10, тогда как сплит занял 12
FastSplit занял 7, тогда как сплит взял 9
FastSplit занял 6, тогда как сплит занял 8
FastSplit занял 5, тогда как сплит занял 7
FastSplit занял 10, тогда как сплит занял 13
FastSplit занял 9, тогда как сплит занял 232
FastSplit занял 7, тогда как сплит занял 8
FastSplit занял 8, тогда как сплит взял 9
FastSplit занял 8, тогда как сплит занял 10
FastSplit занял 215, тогда как сплит занял 217
FastSplit занял 10, тогда как сплит занял 231
FastSplit занял 8, тогда как сплит занял 10
FastSplit занял 8, тогда как сплит занял 10
FastSplit занял 7, тогда как сплит взял 9
FastSplit занял 8, тогда как сплит занял 10
FastSplit занял 10, тогда как сплит занял 1405
FastSplit занял 9, тогда как сплит занял 11
FastSplit занял 8, тогда как сплит занял 10
Кроме того, я знаю, что кто-то будет препятствовать моему использованию ReDim Preserve вместо использования списка ... Причина в том, что в списке действительно не было никакой разницы в скорости в моих тестах, поэтому я вернулся к «простому» .