1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| Module ReplacementTests
Sub Main()
Const loremPath = "loremIpsum.txt"
Const iterations = 10000
Const diacritics = "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåæçèéêëìíîïù²&~#{([|`_\^@)]°}=+^¨$£¤%µ*,?;:/!§<>"
' Make sure all params are good (path, length)
Dim longDiacritics = String.Concat(Enumerable.Repeat(New Random, iterations).Select(Function(rnd) diacritics(rnd.Next(diacritics.Length))))
Dim loremIpsum = IO.File.ReadAllText(loremPath)
Dim shortLorem = loremIpsum.Substring(0, diacritics.Length)
Dim longLorem = loremIpsum.Substring(0, iterations)
Dim samples As New Dictionary(Of String, String) From {
{"Empty", String.Empty},
{"All Diacritics Once", diacritics},
{"Only Diacritics LongText", longDiacritics},
{"Lorem Ipsum ShortText", shortLorem},
{"Lorem Ipsum LongText", longLorem}
}
' Call for nothing to load and let JIT do it's stuff
ReplaceLoop(String.Empty)
StringBuilderLoop(String.Empty)
For Each sample In samples
Console.WriteLine(sample.Key)
Console.WriteLine("{0}{1} times ReplaceLoop in {2}", vbTab, iterations, Measure(Sub()
For i = 1 To iterations
ReplaceLoop(sample.Value)
Next
End Sub))
Console.WriteLine("{0}{1} times StringBuilderLoop in {2}", vbTab, iterations, Measure(Sub()
For i = 1 To iterations
StringBuilderLoop(sample.Value)
Next
End Sub))
Next
End Sub
Function ReplaceLoop(input As String) As String
Const Diacritics = "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåæçèéêëìíîïù²&~#{([|`_\^@)]°}=+^¨$£¤%µ*,?;:/!§<>"
Const Normalized = "AAAAAAACEEEEIIIIDNOOOOOUUUUUaaaaaaaceeeeiiiiu "
For i = 0 To Normalized.Length - 1
input = input.Replace(Diacritics(i), Normalized(i))
Next
Return input
End Function
Function StringBuilderLoop(input As String) As String
Const Diacritics = "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖÙÚÛÜÝàáâãäåæçèéêëìíîïù²&~#{([|`_\^@)]°}=+^¨$£¤%µ*,?;:/!§<>"
Const Normalized = "AAAAAAACEEEEIIIIDNOOOOOUUUUUaaaaaaaceeeeiiiiu "
' TODO: test input null ?
Dim builder As New Text.StringBuilder(input.Length)
For Each character In input
Dim index = Diacritics.IndexOf(character)
' Could also use a classic If here
builder.Append(If(index > -1, Normalized(index), character))
Next
Return builder.ToString
End Function
Function Measure(body As Action) As TimeSpan
Dim watch = Stopwatch.StartNew
body()
Return watch.Elapsed
End Function
End Module |
Partager