Concurrent Clean : String2 : 速度調査

適当なテストプログラムを書いて、速度調査してみた。
結果は次の通り。
組み込み文字列

$ ./bench_string 10000
"tabcdeabcdeqwertabcdeabcdertabcdeabcdeqwertabcdeabcdedeqwertabcdeabcdeqwertabcdeabcdeqwertabcdeabcdetabcdeabcdeqwertabcdeabcdertabcdeab"
Execution: 0.13  Garbage collection: 0.01  Total: 0.14

String2

$ ./bench_string2 10000
"tabcdeabcdeqwertabcdeabcdertabcdeabcdeqwertabcdeabcdedeqwertabcdeabcdeqwertabcdeabcdeqwertabcdeabcdetabcdertabcdeabcdeqwertabcdeabcdeqw"
Execution: 0.66  Garbage collection: 0.20  Total: 0.86

おそらく、メモリ領域の再利用を行いやすいプログラムだったため、単純な配列でも効率がよかったのではないかと推測する。長大文字列のコピーが多発するようなケースでは逆転すると思う。
このテストプログラムの妥当性がどの程度のものかもよくわからない。

以下、テストプログラム
組み込み文字列

Start :: {#Char}
Start = loop times "qwertyuioplkjhgfdsazxcvbnm"
  where
    times = toInt (getCommandLine.[1])

    loop 0 s = s
    loop n s = next (n - 1) (loop2 10 s)

    next n s
       # len = size s
         half = len / 2
         third = len / 3
         s0 = s % (0, half - 1)
         s1 = s % (half, len - 1)
         s = s0 +++ s1
         s2 = s % (third, 2 * third)
       = loop n s2

    loop2 n s | s startsWith "abcdeabc"
                 | n == 0 = s
                 = loop2 (n - 1) ("qwert" +++ s)
              = loop2 n ("abcde" +++ s +++ "abcde")

String2版

Start :: {#Char}
Start = loop times (S"qwertyuioplkjhgfdsazxcvbnm")
  where
    times = toInt (getCommandLine.[1])

    loop 0 s = {a \\ a <- list s}
    loop n s = next (n - 1) (loop2 10 s)

    next n s
       # len = length s
         half = len / 2
         third = len / 3
         s0 = s % (0, half - 1)
         s1 = s % (half, len - 1)
         s = s0 +++ s1
         s2 = s % (third, 2 * third)
       = loop n s2

    loop2 n s = case list s of
                  ['abcdeabc':_]
                    | n == 0 = s
                    = loop2 (n - 1) (S"qwert" +++ s)
                  _ = loop2 n (S"abcde" +++ s +++ S"abcde")