String: Avoid char-by-char copy during replace.

This version is roughly twice as fast after the rewrite in change
a8d952d4388d5173dedc3a80381328fd9d7c5f07. Note that the M version
suffered from the same flaw.

BEFORE
------
      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSequenceNonExistent, vm=default, parameters={s=EMPTY}}
        runtime(ns): min=32.24, 1st qu.=32.36, median=32.65, mean=32.80, 3rd qu.=33.32, max=33.67
      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSequenceNonExistent, vm=default, parameters={s=L_16}}
        runtime(ns): min=49.22, 1st qu.=49.54, median=49.99, mean=50.19, 3rd qu.=50.54, max=52.23
      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSequenceNonExistent, vm=default, parameters={s=L_64}}
        runtime(ns): min=227.23, 1st qu.=229.91, median=231.68, mean=231.58, 3rd qu.=232.79, max=236.38
      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSequenceNonExistent, vm=default, parameters={s=L_256}}
        runtime(ns): min=893.41, 1st qu.=897.96, median=905.14, mean=912.62, 3rd qu.=920.15, max=966.30

      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSequenceRepeated, vm=default, parameters={s=EMPTY}}
        runtime(ns): min=32.60, 1st qu.=32.69, median=32.98, mean=33.02, 3rd qu.=33.07, max=34.12
      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSequenceRepeated, vm=default, parameters={s=L_16}}
        runtime(ns): min=48.43, 1st qu.=48.76, median=49.08, mean=49.31, 3rd qu.=49.87, max=50.72
      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSequenceRepeated, vm=default, parameters={s=L_64}}
        runtime(ns): min=2517.18, 1st qu.=2541.84, median=2662.98, mean=2709.11, 3rd qu.=2775.76, max=3226.40
      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSequenceRepeated, vm=default, parameters={s=L_256}}
        runtime(ns): min=10265.82, 1st qu.=11161.48, median=12261.24, mean=12058.61, 3rd qu.=12839.44, max=13236.97

      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSingleSequence, vm=default, parameters={s=EMPTY}}
        runtime(ns): min=31.81, 1st qu.=32.31, median=32.56, mean=32.71, 3rd qu.=33.21, max=33.82
      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSingleSequence, vm=default, parameters={s=L_16}}
        runtime(ns): min=894.87, 1st qu.=910.36, median=938.87, mean=981.06, 3rd qu.=1001.98, max=1300.58
      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSingleSequence, vm=default, parameters={s=L_64}}
        runtime(ns): min=2670.28, 1st qu.=2680.25, median=2732.86, mean=2806.53, 3rd qu.=2768.80, max=3514.73
      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSingleSequence, vm=default, parameters={s=L_256}}
        runtime(ns): min=10099.17, 1st qu.=10323.71, median=10500.71, mean=10950.80, 3rd qu.=10913.56, max=14215.69

AFTER
-----
      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSequenceNonExistent, vm=default, parameters={s=EMPTY}}
        runtime(ns): min=32.16, 1st qu.=32.27, median=32.47, mean=32.46, 3rd qu.=32.65, max=32.80
      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSequenceNonExistent, vm=default, parameters={s=L_16}}
        runtime(ns): min=48.74, 1st qu.=49.04, median=49.18, mean=49.37, 3rd qu.=49.56, max=50.81
      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSequenceNonExistent, vm=default, parameters={s=L_64}}
        runtime(ns): min=228.67, 1st qu.=229.15, median=230.99, mean=231.22, 3rd qu.=232.97, max=234.63
      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSequenceNonExistent, vm=default, parameters={s=L_256}}
        runtime(ns): min=896.83, 1st qu.=898.40, median=904.05, mean=906.79, 3rd qu.=916.44, max=919.98

      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSequenceRepeated, vm=default, parameters={s=EMPTY}}
        runtime(ns): min=32.07, 1st qu.=32.11, median=32.44, mean=32.64, 3rd qu.=32.66, max=35.07
      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSequenceRepeated, vm=default, parameters={s=L_16}}
        runtime(ns): min=48.66, 1st qu.=48.96, median=49.39, mean=49.33, 3rd qu.=49.64, max=50.01
      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSequenceRepeated, vm=default, parameters={s=L_64}}
        runtime(ns): min=1638.41, 1st qu.=1666.38, median=1678.58, mean=1725.19, 3rd qu.=1819.44, max=1870.15
      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSequenceRepeated, vm=default, parameters={s=L_256}}
        runtime(ns): min=4519.89, 1st qu.=4836.48, median=5659.44, mean=5495.27, 3rd qu.=6065.99, max=6277.55

      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSingleSequence, vm=default, parameters={s=EMPTY}}
        runtime(ns): min=32.25, 1st qu.=32.33, median=32.49, mean=32.71, 3rd qu.=32.74, max=34.48
      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSingleSequence, vm=default, parameters={s=L_16}}
        runtime(ns): min=673.04, 1st qu.=712.29, median=798.60, mean=801.31, 3rd qu.=882.12, max=960.31
      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSingleSequence, vm=default, parameters={s=L_64}}
        runtime(ns): min=1113.34, 1st qu.=1426.13, median=1614.06, mean=1633.30, 3rd qu.=1880.92, max=2078.03
      Experiment {instrument=runtime, benchmarkMethod=timeReplaceSingleSequence, vm=default, parameters={s=L_256}}
        runtime(ns): min=3657.71, 1st qu.=4101.37, median=4742.67, mean=4607.25, 3rd qu.=5164.10, max=5259.11

bug: 28060800
Change-Id: I6827d5bec6054e1c6dd2efbcc1d2b2a8f734d288
1 file changed