module iteration_bench
import opts
+intrude import standard::ropes
-fun bench_rope_iter(nb_cct: Int, loops: Int, strlen: Int)
+redef class Concat
+ redef fun +(o) do
+ var s = o.to_s
+ return new Concat(self, s)
+ end
+end
+
+redef class FlatString
+ redef fun +(o) do
+ var s = o.to_s
+ var b = new FlatBuffer.with_capacity(length + s.length)
+ b.append self
+ for i in s.substrings do b.append i
+ return b.to_s
+ end
+end
+
+fun bench_flatstr_iter(nb_cct: Int, loops: Int, strlen: Int)
do
var a = "a" * strlen
- var x:String = new RopeString.from(a)
- for i in [0 .. nb_cct] do x += a
+ a = a * nb_cct
var cnt = 0
var c: Char
while cnt != loops do
- for i in x do
+ for i in a do
c = i
end
cnt += 1
end
end
-fun bench_rope_index(nb_cct: Int, loops: Int, strlen: Int)
+fun bench_flatstr_index(nb_cct: Int, loops: Int, strlen: Int)
do
var a = "a" * strlen
- var x:String = new RopeString.from(a)
- for i in [0 .. nb_cct] do x += a
+ a = a * nb_cct
var cnt = 0
var c: Char
var pos = 0
while cnt != loops do
pos = 0
- while pos < x.length do
- c = x[pos]
+ while pos < a.length do
+ c = a[pos]
pos += 1
end
cnt += 1
end
end
-fun bench_flatstr_iter(nb_cct: Int, loops: Int, strlen: Int)
+fun bench_ropestr_iter(nb_cct: Int, loops: Int, strlen: Int)
do
var a = "a" * strlen
- var x = a
- for i in [0 .. nb_cct] do x += a
+ var x: String = new Concat(a, a)
+ for i in [2 .. nb_cct[ do x = new Concat(x, a)
var cnt = 0
var c: Char
while cnt != loops do
end
end
-fun bench_flatstr_index(nb_cct: Int, loops: Int, strlen: Int)
+fun bench_ropestr_index(nb_cct: Int, loops: Int, strlen: Int)
do
var a = "a" * strlen
- var x = a
- for i in [0 .. nb_cct] do x += a
+ var x: String = new Concat(a, a)
+ for i in [2 .. nb_cct[ do x = new Concat(x, a)
var cnt = 0
var c: Char
var pos = 0
fun bench_flatbuf_iter(nb_cct: Int, loops: Int, strlen: Int)
do
var a = "a" * strlen
+ a = a * nb_cct
var x = new FlatBuffer.from(a)
- for i in [0 .. nb_cct] do x.append a
var cnt = 0
var c: Char
while cnt != loops do
fun bench_flatbuf_index(nb_cct: Int, loops: Int, strlen: Int)
do
var a = "a" * strlen
+ a = a * nb_cct
var x = new FlatBuffer.from(a)
- for i in [0 .. nb_cct] do x.append a
+ var cnt = 0
+ var c: Char
+ var pos = 0
+ while cnt != loops do
+ pos = 0
+ while pos < x.length do
+ c = x[pos]
+ pos += 1
+ end
+ cnt += 1
+ end
+end
+
+fun bench_ropebuf_iter(nb_cct: Int, loops: Int, strlen: Int)
+do
+ var a = "a" * strlen
+ var x = new RopeBuffer.from(a)
+ for i in [0 .. nb_cct[ do x.append a
+ var cnt = 0
+ var c: Char
+ while cnt != loops do
+ for i in x do
+ c = i
+ end
+ cnt += 1
+ end
+end
+
+fun bench_ropebuf_index(nb_cct: Int, loops: Int, strlen: Int)
+do
+ var a = "a" * strlen
+ var x = new RopeBuffer.from(a)
+ for i in [0 .. nb_cct[ do x.append a
var cnt = 0
var c: Char
var pos = 0
end
var opts = new OptionContext
-var mode = new OptionEnum(["rope", "flatstr", "flatbuf"], "Mode", -1, "-m")
+var mode = new OptionEnum(["flatstr", "flatbuf", "ropestr", "ropebuf"], "Mode", -1, "-m")
var access_mode = new OptionEnum(["iterator", "index"], "Iteration mode", -1, "--iter-mode")
var nb_ccts = new OptionInt("Number of concatenations done to the string (in the case of the rope, this will increase its depth)", -1, "--ccts")
var loops = new OptionInt("Number of loops to be done", -1, "--loops")
if modval == 0 then
if iterval == 0 then
- bench_rope_iter(nb_ccts.value, loops.value, strlen.value)
+ bench_flatstr_iter(nb_ccts.value, loops.value, strlen.value)
else if iterval == 1 then
- bench_rope_index(nb_ccts.value, loops.value, strlen.value)
+ bench_flatstr_index(nb_ccts.value, loops.value, strlen.value)
else
opts.usage
exit(-1)
end
else if modval == 1 then
if iterval == 0 then
- bench_flatstr_iter(nb_ccts.value, loops.value, strlen.value)
+ bench_flatbuf_iter(nb_ccts.value, loops.value, strlen.value)
else if iterval == 1 then
- bench_flatstr_index(nb_ccts.value, loops.value, strlen.value)
+ bench_flatbuf_index(nb_ccts.value, loops.value, strlen.value)
else
opts.usage
exit(-1)
end
else if modval == 2 then
if iterval == 0 then
- bench_flatbuf_iter(nb_ccts.value, loops.value, strlen.value)
+ bench_ropestr_iter(nb_ccts.value, loops.value, strlen.value)
else if iterval == 1 then
- bench_flatbuf_index(nb_ccts.value, loops.value, strlen.value)
+ bench_ropestr_index(nb_ccts.value, loops.value, strlen.value)
+ else
+ opts.usage
+ exit(-1)
+ end
+else if modval == 3 then
+ if iterval == 0 then
+ bench_ropebuf_iter(nb_ccts.value, loops.value, strlen.value)
+ else if iterval == 1 then
+ bench_ropebuf_index(nb_ccts.value, loops.value, strlen.value)
else
opts.usage
exit(-1)