/*
* Copyright 2015 The Netty Project
*
* The Netty Project licenses this file to you under the Apache License, version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package io.netty.microbenchmark.common;
import java.util.Random;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Level;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Param;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
import io.netty.microbench.util.AbstractMicrobenchmark;
@Threads(1)
@Warmup(iterations = 5)
@Measurement(iterations = 5)
public class AppendableCharSequenceBenchmark extends AbstractMicrobenchmark {
@Param({ "32", "64", "128", "256" })
private int charsInitSize;
@Param({ "10", "100", "10000", "1000000" })
private int simulatedDataSize;
private static final Random rand = new Random();
private char[] chars;
private char simulatedData;
private int pos;
@Setup(Level.Trial)
public void setup() {
chars = new char[charsInitSize];
simulatedData = (char) rand.nextInt();
}
@Benchmark
public void appendCheckBeforeCopy() {
checkReset();
if (pos == chars.length) {
expand();
}
chars[pos++] = simulatedData;
}
@Benchmark
public void appendCatchExceptionAfter() {
checkReset();
try {
chars[pos++] = simulatedData;
} catch (IndexOutOfBoundsException e) {
expand();
chars[pos - 1] = simulatedData;
}
}
private void checkReset() {
if (pos == simulatedDataSize) {
pos = 0;
chars = new char[charsInitSize];
}
}
private void expand() {
char[] old = chars;
// double it
int len = old.length << 1;
if (len < 0) {
throw new IllegalStateException();
}
chars = new char[len];
System.arraycopy(old, 0, chars, 0, old.length);
}
}