Last active
April 27, 2017 03:39
-
-
Save qwwdfsad/69616e8a42a74def31e48d774c622379 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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