package com.bellsw.simple; import java.util.concurrent.TimeUnit; import java.util.Arrays; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Level; import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Param; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.Threads; import org.openjdk.jmh.annotations.Warmup; import org.openjdk.jmh.annotations.OperationsPerInvocation; @Warmup(iterations = 40) @Measurement(iterations = 5) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) @State(Scope.Benchmark) public class StringCompareBench { static final int BATCH_DATA_SIZE = 17000000; // a bit more than 16mb(L2) @Param({"4", "8", "15", "16", "21", "32", "128", "256", "512", "1024", "1000000"}) int size; int amountOfStrings; String[] latinStrings; String[] utfStrings; @Setup(Level.Trial) public void init() { amountOfStrings = BATCH_DATA_SIZE / size; latinStrings = new String[amountOfStrings]; utfStrings = new String[amountOfStrings]; char[] charsL = new char[size]; char[] charsU = new char[size]; for (int i = 0; i < size; i++) { charsL[i] = 'A'; charsU[i] = 'A'; } charsU[size - 1] = (char) 0xCAFE; for (int i = 0; i < amountOfStrings; i++) { latinStrings[i] = new String(charsL); utfStrings[i] = new String(charsU); } } @Benchmark @Threads(1) public int StringCompareLL() { int accum = 0; for (int i = 0; i < amountOfStrings - 1; i++) { accum += latinStrings[i].compareTo(latinStrings[i+1]); } return accum; } @Benchmark @Threads(1) public int StringCompareUU() { int accum = 0; for (int i = 0; i < amountOfStrings - 1; i++) { accum += utfStrings[i].compareTo(utfStrings[i+1]); } return accum; } @Benchmark @Threads(1) public int StringCompareLU() { int accum = 0; for (int i = 0; i < amountOfStrings - 1; i++) { accum += utfStrings[i].compareTo(latinStrings[i+1]); } return accum; } @Benchmark @Threads(1) public int StringCompareUL() { int accum = 0; for (int i = 0; i < amountOfStrings - 1; i++) { accum += latinStrings[i].compareTo(utfStrings[i+1]); } return accum; } }