X-Git-Url: http://nitlanguage.org diff --git a/benchmarks/strings/chain_concat.nit b/benchmarks/strings/chain_concat.nit index a45075f..a70dd14 100644 --- a/benchmarks/strings/chain_concat.nit +++ b/benchmarks/strings/chain_concat.nit @@ -11,35 +11,78 @@ # Benches measuring the performance of several concatenations on Text variants module chain_concat +intrude import standard::ropes import opts +redef class FlatString + redef fun +(o) do + var mlen = length + var slen = o.length + var nlen = mlen + slen + var ns = new NativeString(nlen + 1) + items.copy_to(ns, mlen, index_from, 0) + if o isa FlatString then + o.items.copy_to(ns, slen, o.index_from, 0) + else + var pos = mlen + for i in o.chars do + ns[pos] = i + pos += 1 + end + end + return ns.to_s_with_length(nlen) + end +end + fun bench_flatstr(str_size: Int, nb_ccts: Int, loops: Int) do var lft = "a" * str_size - for i in [0..loops] do - var str: String = lft - for j in [0..nb_ccts] do + for i in [0 .. loops[ do + var str: String = "" + for j in [0 .. nb_ccts[ do str += lft end end end +fun bench_ropestr(str_size, nb_ccts, loops: Int) do + var lft = "a" * str_size + + for i in [0 .. loops[ do + var str: String = "" + for j in [0 .. nb_ccts[ do + str = new Concat(str, lft) + end + end +end + fun bench_flatbuf(str_size: Int, nb_ccts: Int, loops: Int) do var lft = "a" * str_size - for i in [0..loops] do - var buf = new FlatBuffer.from(lft) - for j in [0..nb_ccts] do + for i in [0 .. loops[ do + var buf = new FlatBuffer + for j in [0 .. nb_ccts[ do + buf.append(lft) + end + end +end + +fun bench_ropebuf(str_size: Int, nb_ccts: Int, loops: Int) +do + var lft = "a" * str_size + + for i in [0 .. loops[ do + var buf = new RopeBuffer + for j in [0 .. nb_ccts[ do buf.append(lft) end - buf.to_s end end var opts = new OptionContext -var mode = new OptionEnum(["flatstr", "flatbuf"], "Mode", -1, "-m") +var mode = new OptionEnum(["flatstr", "ropestr", "flatbuf", "ropebuf"], "Mode", -1, "-m") var nb_ccts = new OptionInt("Number of concatenations per loop", -1, "--ccts") var loops = new OptionInt("Number of loops to be done", -1, "--loops") var strlen = new OptionInt("Length of the base string", -1, "--strlen") @@ -57,7 +100,12 @@ var modval = mode.value if modval == 0 then bench_flatstr(strlen.value, nb_ccts.value, loops.value) else if modval == 1 then + bench_ropestr(strlen.value, nb_ccts.value, loops.value) +else if modval == 2 then bench_flatbuf(strlen.value, nb_ccts.value, loops.value) +else if modval == 3 then + bench_ropebuf(strlen.value, nb_ccts.value, loops.value) + else opts.usage exit -1