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