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; @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({"1", "4", "8", "15", "16", "21", "32", "128", "256", "512", "1024", "1000000"}) int size; int amountOfStrings; String[] latinStrings; String[] utfStrings; int arrayCounter; @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); } arrayCounter = 0; } @Benchmark @Threads(1) public int StringCompareLL() { arrayCounter++; String str1 = latinStrings[arrayCounter % amountOfStrings]; String str2 = latinStrings[(arrayCounter + 1) % amountOfStrings]; return str1.compareTo(str2); } @Benchmark @Threads(1) public int StringCompareUU() { arrayCounter++; String str1 = utfStrings[arrayCounter % amountOfStrings]; String str2 = utfStrings[(arrayCounter + 1) % amountOfStrings]; return str1.compareTo(str2); } @Benchmark @Threads(1) public int StringCompareLU() { arrayCounter++; String str1 = utfStrings[arrayCounter % amountOfStrings]; String str2 = latinStrings[(arrayCounter + 1) % amountOfStrings]; return str1.compareTo(str2); } @Benchmark @Threads(1) public int StringCompareUL() { arrayCounter++; String str1 = latinStrings[arrayCounter % amountOfStrings]; String str2 = utfStrings[(arrayCounter + 1) % amountOfStrings]; return str1.compareTo(str2); } }