Concurrent Clean : 訂正記事 : 部分文字列と文字列コピー
[id:lethevert:20061102:p1]と[id:lethevert:20061103:p3]でつきまくった嘘を訂正します。
まず、[id:lethevert:20061102:p1]をちゃんと読むと、
rep movsl
とか書いてありやがりますです。
私の認識では、これはまさしく文字列コピー。
-
-
- -
-
で、[id:lethevert:20061103:p3]でどうして差が出なかったかというと、評価すべき式を遅延評価で評価せずに飛ばしてしまっていたからでした。(一体何年Cleanと付き合っているのやら・・・。)ヒーププロファイラのせいにしていましたが、全て私の凡ミスのおかげです。Cleanは何も悪くありませんでした。
ということで、10000000回の試行をやり直した結果です。比較文字列は"aaa"で。
$ time ./ByRuntime.exe False real 0m2.785s user 0m0.020s sys 0m0.050s $ time ./ByClean.exe False real 0m2.126s user 0m0.020s sys 0m0.030s
部分文字列を使っている方が遅くなっています。
比較文字列を長くして、"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"にしてみると、
$ time ./ByRuntime.exe False real 0m3.237s user 0m0.030s sys 0m0.030s $ time ./ByClean.exe False real 0m3.481s user 0m0.020s sys 0m0.050s
部分文字列を使っている方がやや有利なようです。これは、おそらく組み込みの文字列比較 eqAC を使っていることで、文字列比較の速度差が効いてきたのだと思います。
プロファイラの結果をみると、確かにアロケーションが行われています。