wisp
 
(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