(Arne Babenhauserheide)
2013-09-13: added replace-substring benchmarks as example added replace-substring benchmarks as example
diff --git a/examples/string-replace-benchmark.w b/examples/string-replace-benchmark.w new file mode 100644 --- /dev/null +++ b/examples/string-replace-benchmark.w @@ -0,0 +1,67 @@ +define-module : examples string-replace-benchmark + . #:export : string-replace-substring string-replace-substring/startindex string-replace-substring/addindex string-replace-substring/naive + +; ,time (string-replace-substring (xsubstring "abcdefghijkl" 0 99999) "def" "abc") +; 0.010369s real time, 0.010348s run time. 0.000000s spent in GC. +define* : string-replace-substring s substr replacement #:optional (start 0) (end (string-length s)) + . "Replace every instance of substring in s by replacement." + let : : substr-length : string-length substr + if : zero? substr-length + error "string-replace-substring: empty substr" + let loop + : start start + pieces : list : substring s 0 start + let : : idx : string-contains s substr start end + if idx + loop : + idx substr-length + cons* replacement + substring s start idx + . pieces + string-concatenate-reverse + cons : substring s start + . pieces + +; ,time (string-replace-substring (xsubstring "abcdefghijkl" 0 99999) "def" "abc") +; 1.112429s real time, 1.083435s run time. 0.780863s spent in GC. +define : string-replace-substring/startindex s substring replacement + . "Replace every instance of substring in s by replacement." + let : : sublen : string-length substring + let replacer + : newstring s + index : string-contains s substring + if : not : equal? index #f + let : : replaced : string-replace newstring replacement index : + index sublen + replacer replaced : string-contains replaced substring index ; only look at parts after index + . newstring + + +; ,time (string-replace-substring (xsubstring "abcdefghijkl" 0 99999) "def" "abc") +; 1.044660s real time, 1.042901s run time. 0.761600s spent in GC. +define : string-replace-substring/addindex s substring replacement + . "Replace every instance of substring in s by replacement." + let : : sublen : string-length substring + let replacer + : newstring s + startindex 0 + addindex : string-contains s substring + if : not : equal? addindex #f + let* + : index : + startindex addindex + replaced : string-replace newstring replacement index : + index sublen + newaddindex : string-contains (substring/read-only replaced index) substring + replacer replaced index newaddindex + . newstring + + +; ,time (string-replace-substring (xsubstring "abcdefghijkl" 0 99999) "def" "abc") +; 7.547528s real time, 7.534397s run time. 0.764280s spent in GC. +define : string-replace-substring/naive s substring replacement + . "Replace every instance of substring in s by replacement." + let : : sublen : string-length substring + let replacer + : newstring s + index : string-contains s substring + if : not : equal? index #f + let : : replaced : string-replace newstring replacement index : + index sublen + replacer replaced : string-contains replaced substring + . newstring