Skip to content

Instantly share code, notes, and snippets.

@qwwdfsad
Last active April 27, 2017 03:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save qwwdfsad/69616e8a42a74def31e48d774c622379 to your computer and use it in GitHub Desktop.
Save qwwdfsad/69616e8a42a74def31e48d774c622379 to your computer and use it in GitHub Desktop.
package org.qwwdfsad.benchmarks;
import org.openjdk.jmh.annotations.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;
/**
* @author Tolstopyatov Vsevolod
* @since 01/10/16
*/
@Fork(value = 1) //jvmArgsAppend = arrayOf("-XX:TieredStopAtLevel=1"))
@Measurement(iterations = 10)
@Warmup(iterations = 10)
@State(Scope.Benchmark)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class JavaStringBenchmark {
@Param({"5", "10", "25", "50", "100"})
int stringLength;
String string;
@Setup
public void init() {
string = IntStream.range(0, stringLength)
.map(i -> 'a' + (i % ('z' - 'a' + 1)))
.collect(StringBuilder::new,
StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
}
@Benchmark
public int charAt() {
String cs = string;
for (int i = 0; i < cs.length(); i++) {
if (cs.charAt(i) == '|') {
return 1;
}
}
return 0;
}
}
Unpatched, C2:
Benchmark (stringLength) Mode Cnt Score Error Units
JavaStringBenchmark.charAt 5 avgt 10 4.291 ? 0.025 ns/op
JavaStringBenchmark.charAt 10 avgt 10 5.812 ? 0.110 ns/op
JavaStringBenchmark.charAt 25 avgt 10 8.171 ? 0.038 ns/op
JavaStringBenchmark.charAt 50 avgt 10 12.595 ? 0.221 ns/op
JavaStringBenchmark.charAt 100 avgt 10 20.174 ? 0.673 ns/op
StringBenchmark.charAt 5 avgt 10 6.297 ? 0.007 ns/op
StringBenchmark.charAt 10 avgt 10 6.156 ? 0.041 ns/op
StringBenchmark.charAt 25 avgt 10 10.142 ? 0.023 ns/op
StringBenchmark.charAt 50 avgt 10 12.668 ? 0.019 ns/op
StringBenchmark.charAt 100 avgt 10 20.199 ? 0.024 ns/op
StringBenchmark.string 5 avgt 10 6.666 ? 0.029 ns/op
StringBenchmark.string 10 avgt 10 9.391 ? 0.070 ns/op
StringBenchmark.string 25 avgt 10 11.625 ? 0.344 ns/op
StringBenchmark.string 50 avgt 10 17.167 ? 0.211 ns/op
StringBenchmark.string 100 avgt 10 28.717 ? 0.068 ns/op
Unpatched, C1:
Benchmark (stringLength) Mode Cnt Score Error Units
JavaStringBenchmark.charAt 5 avgt 10 6.547 ? 0.003 ns/op
JavaStringBenchmark.charAt 10 avgt 10 10.072 ? 0.009 ns/op
JavaStringBenchmark.charAt 25 avgt 10 28.487 ? 1.721 ns/op
JavaStringBenchmark.charAt 50 avgt 10 49.782 ? 0.069 ns/op
JavaStringBenchmark.charAt 100 avgt 10 88.735 ? 1.999 ns/op
StringBenchmark.charAt 5 avgt 10 6.643 ? 0.014 ns/op
StringBenchmark.charAt 10 avgt 10 9.885 ? 0.103 ns/op
StringBenchmark.charAt 25 avgt 10 27.667 ? 0.233 ns/op
StringBenchmark.charAt 50 avgt 10 44.377 ? 0.126 ns/op
StringBenchmark.charAt 100 avgt 10 76.319 ? 0.755 ns/op
StringBenchmark.string 5 avgt 10 29.300 ? 0.092 ns/op
StringBenchmark.string 10 avgt 10 51.920 ? 0.080 ns/op
StringBenchmark.string 25 avgt 10 129.637 ? 0.234 ns/op
StringBenchmark.string 50 avgt 10 243.009 ? 0.499 ns/op
StringBenchmark.string 100 avgt 10 469.338 ? 0.675 ns/op
Patched C2:
Benchmark (stringLength) Mode Cnt Score Error Units
JavaStringBenchmark.charAt 5 avgt 10 4.306 ? 0.065 ns/op
JavaStringBenchmark.charAt 10 avgt 10 6.264 ? 0.928 ns/op
JavaStringBenchmark.charAt 25 avgt 10 8.184 ? 0.018 ns/op
JavaStringBenchmark.charAt 50 avgt 10 12.562 ? 0.050 ns/op
JavaStringBenchmark.charAt 100 avgt 10 19.847 ? 0.041 ns/op
StringBenchmark.charAt 5 avgt 10 6.304 ? 0.035 ns/op
StringBenchmark.charAt 10 avgt 10 6.148 ? 0.012 ns/op
StringBenchmark.charAt 25 avgt 10 10.143 ? 0.063 ns/op
StringBenchmark.charAt 50 avgt 10 12.681 ? 0.066 ns/op
StringBenchmark.charAt 100 avgt 10 20.209 ? 0.041 ns/op
StringBenchmark.string 5 avgt 10 4.590 ? 0.085 ns/op
StringBenchmark.string 10 avgt 10 5.802 ? 0.009 ns/op
StringBenchmark.string 25 avgt 10 8.362 ? 0.125 ns/op
StringBenchmark.string 50 avgt 10 12.628 ? 0.027 ns/op
StringBenchmark.string 100 avgt 10 19.993 ? 0.045 ns/op
Patched C1:
Benchmark (stringLength) Mode Cnt Score Error Units
JavaStringBenchmark.charAt 5 avgt 10 6.551 ? 0.006 ns/op
JavaStringBenchmark.charAt 10 avgt 10 10.061 ? 0.005 ns/op
JavaStringBenchmark.charAt 25 avgt 10 28.540 ? 1.098 ns/op
JavaStringBenchmark.charAt 50 avgt 10 49.835 ? 0.169 ns/op
JavaStringBenchmark.charAt 100 avgt 10 87.446 ? 0.072 ns/op
StringBenchmark.charAt 5 avgt 10 6.668 ? 0.029 ns/op
StringBenchmark.charAt 10 avgt 10 9.835 ? 0.018 ns/op
StringBenchmark.charAt 25 avgt 10 27.941 ? 1.341 ns/op
StringBenchmark.charAt 50 avgt 10 44.641 ? 0.893 ns/op
StringBenchmark.charAt 100 avgt 10 75.886 ? 0.043 ns/op
StringBenchmark.string 5 avgt 10 6.350 ? 0.007 ns/op
StringBenchmark.string 10 avgt 10 9.815 ? 0.003 ns/op
StringBenchmark.string 25 avgt 10 27.527 ? 0.330 ns/op
StringBenchmark.string 50 avgt 10 42.557 ? 0.041 ns/op
StringBenchmark.string 100 avgt 10 73.943 ? 0.042 ns/op
package org.qwwdfsad.benchmarks
import org.openjdk.jmh.annotations.*
import java.util.concurrent.TimeUnit
/**
* @author Tolstopyatov Vsevolod
* @since 28/09/16
*/
@Fork(value = 1) //jvmArgsAppend = arrayOf("-XX:TieredStopAtLevel=1"))
@Measurement(iterations = 10)
@Warmup(iterations = 10)
@State(Scope.Benchmark)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
open class StringBenchmark() {
@Param("5", "10", "25", "50", "100")
var stringLength: Int = 0
var string: String = ""
@Setup
fun init() {
string = (0 until stringLength).map { 'a' + (it % ('z' - 'a' + 1)) }.joinToString("", "", "")
}
@Benchmark
fun string(): Int {
val cs = string
for (c in cs) {
// Dead branch, trick DCE without BH#consume
if (c == '|') {
return 1
}
}
return 0
}
@Benchmark
fun charAt(): Int {
val cs = string
for (i in 0..cs.length - 1) {
// Dead branch, trick DCE without BH#consume
if (cs[i] == '|') {
return 1
}
}
return 0
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment