Skip to content

Instantly share code, notes, and snippets.

@amaembo
Created June 27, 2015 02:19
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 amaembo/461e663e696ad9f15447 to your computer and use it in GitHub Desktop.
Save amaembo/461e663e696ad9f15447 to your computer and use it in GitHub Desktop.
CharsTest: comparison of different ways to create the stream of chars from String
import java.util.concurrent.TimeUnit;
import java.util.stream.*;
import java.util.*;
import java.nio.*;
import org.openjdk.jmh.infra.Blackhole;
import org.openjdk.jmh.annotations.*;
@Warmup(iterations = 5, time = 500, timeUnit = TimeUnit.MILLISECONDS)
@Measurement(iterations = 10, time = 500, timeUnit = TimeUnit.MILLISECONDS)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Fork(3)
@State(Scope.Benchmark)
public class CharsTest {
@Param({ "100", "10000", "1000000" })
private int n;
private String input;
@Setup
public void setUp() {
Random r = new Random(1);
input = collect(r.ints(n, 'A', 'z'));
}
private String collect(IntStream is) {
return is.collect(StringBuilder::new, (sb, c) -> sb.append((char)c), StringBuilder::append).toString();
}
@Benchmark
public void baseline(Blackhole bh) {
bh.consume(input.toUpperCase());
}
@Benchmark
public void byChar(Blackhole bh) {
char[] cc = input.toCharArray();
for(int i=0; i<cc.length; i++)
cc[i] = Character.toUpperCase(cc[i]);
bh.consume(new String(cc));
}
@Benchmark
public void chars(Blackhole bh) {
bh.consume(collect(input.chars().map(Character::toUpperCase)));
}
@Benchmark
public void charsParallel(Blackhole bh) {
bh.consume(collect(input.chars().parallel().map(Character::toUpperCase)));
}
@Benchmark
public void charBuffer(Blackhole bh) {
bh.consume(collect(CharBuffer.wrap(input).chars().map(Character::toUpperCase)));
}
@Benchmark
public void charBufferParallel(Blackhole bh) {
bh.consume(collect(CharBuffer.wrap(input).chars().parallel().map(Character::toUpperCase)));
}
@Benchmark
public void range(Blackhole bh) {
bh.consume(collect(IntStream.range(0, input.length()).map(input::charAt).map(Character::toUpperCase)));
}
@Benchmark
public void rangeParallel(Blackhole bh) {
bh.consume(collect(IntStream.range(0, input.length()).parallel().map(input::charAt).map(Character::toUpperCase)));
}
}
# jdk 1.8.0.20
Benchmark (n) Mode Cnt Score Error Units
CharsTest.baseline 100 avgt 30 0.412 ± 0.001 us/op
CharsTest.baseline 10000 avgt 30 84.778 ± 1.354 us/op
CharsTest.baseline 1000000 avgt 30 9186.889 ± 133.972 us/op
CharsTest.byChar 100 avgt 30 0.199 ± 0.001 us/op
CharsTest.byChar 10000 avgt 30 42.792 ± 3.074 us/op
CharsTest.byChar 1000000 avgt 30 5967.103 ± 10.452 us/op
CharsTest.charBuffer 100 avgt 30 0.909 ± 0.003 us/op
CharsTest.charBuffer 10000 avgt 30 122.368 ± 0.590 us/op
CharsTest.charBuffer 1000000 avgt 30 13064.490 ± 110.556 us/op
CharsTest.charBufferParallel 100 avgt 30 7.705 ± 0.185 us/op
CharsTest.charBufferParallel 10000 avgt 30 54.727 ± 1.054 us/op
CharsTest.charBufferParallel 1000000 avgt 30 4751.401 ± 20.009 us/op
CharsTest.chars 100 avgt 30 1.279 ± 0.004 us/op
CharsTest.chars 10000 avgt 30 156.943 ± 4.228 us/op
CharsTest.chars 1000000 avgt 30 12766.115 ± 379.475 us/op
CharsTest.charsParallel 100 avgt 30 8.515 ± 0.232 us/op
CharsTest.charsParallel 10000 avgt 30 55.489 ± 0.518 us/op
CharsTest.charsParallel 1000000 avgt 30 13858.503 ± 79.425 us/op
CharsTest.range 100 avgt 30 1.388 ± 0.004 us/op
CharsTest.range 10000 avgt 30 172.070 ± 0.692 us/op
CharsTest.range 1000000 avgt 30 16798.184 ± 351.728 us/op
CharsTest.rangeParallel 100 avgt 30 8.221 ± 0.053 us/op
CharsTest.rangeParallel 10000 avgt 30 70.552 ± 0.928 us/op
CharsTest.rangeParallel 1000000 avgt 30 5733.689 ± 59.871 us/op
# jdk 1.8.0.45
Benchmark (n) Mode Cnt Score Error Units
CharsTest.baseline 100 avgt 30 0.278 ± 0.002 us/op
CharsTest.baseline 10000 avgt 30 33.408 ± 0.713 us/op
CharsTest.baseline 1000000 avgt 30 6310.867 ± 8.996 us/op
CharsTest.byChar 100 avgt 30 0.191 ± 0.001 us/op
CharsTest.byChar 10000 avgt 30 43.189 ± 3.465 us/op
CharsTest.byChar 1000000 avgt 30 5993.404 ± 10.930 us/op
CharsTest.charBuffer 100 avgt 30 1.002 ± 0.045 us/op
CharsTest.charBuffer 10000 avgt 30 121.837 ± 1.051 us/op
CharsTest.charBuffer 1000000 avgt 30 12851.197 ± 92.170 us/op
CharsTest.charBufferParallel 100 avgt 30 5.573 ± 0.066 us/op
CharsTest.charBufferParallel 10000 avgt 30 51.410 ± 0.592 us/op
CharsTest.charBufferParallel 1000000 avgt 30 4725.644 ± 56.381 us/op
CharsTest.chars 100 avgt 30 1.305 ± 0.008 us/op
CharsTest.chars 10000 avgt 30 165.347 ± 0.223 us/op
CharsTest.chars 1000000 avgt 30 12317.120 ± 186.215 us/op
CharsTest.charsParallel 100 avgt 30 5.748 ± 0.080 us/op
CharsTest.charsParallel 10000 avgt 30 58.408 ± 0.686 us/op
CharsTest.charsParallel 1000000 avgt 30 14193.598 ± 122.229 us/op
CharsTest.range 100 avgt 30 1.184 ± 0.015 us/op
CharsTest.range 10000 avgt 30 174.745 ± 0.806 us/op
CharsTest.range 1000000 avgt 30 17055.355 ± 415.258 us/op
CharsTest.rangeParallel 100 avgt 30 5.685 ± 0.126 us/op
CharsTest.rangeParallel 10000 avgt 30 67.383 ± 0.788 us/op
CharsTest.rangeParallel 1000000 avgt 30 5788.407 ± 34.844 us/op
# jdk 1.9.0b55
Benchmark (n) Mode Cnt Score Error Units
CharsTest.baseline 100 avgt 30 0.236 ± 0.001 us/op
CharsTest.baseline 10000 avgt 30 41.151 ± 2.510 us/op
CharsTest.baseline 1000000 avgt 30 5872.789 ± 14.646 us/op
CharsTest.byChar 100 avgt 30 0.190 ± 0.001 us/op
CharsTest.byChar 10000 avgt 30 48.322 ± 2.458 us/op
CharsTest.byChar 1000000 avgt 30 5979.789 ± 10.822 us/op
CharsTest.charBuffer 100 avgt 30 0.945 ± 0.037 us/op
CharsTest.charBuffer 10000 avgt 30 122.498 ± 0.272 us/op
CharsTest.charBuffer 1000000 avgt 30 13294.550 ± 70.847 us/op
CharsTest.charBufferParallel 100 avgt 30 5.716 ± 0.044 us/op
CharsTest.charBufferParallel 10000 avgt 30 52.828 ± 0.323 us/op
CharsTest.charBufferParallel 1000000 avgt 30 4843.258 ± 30.411 us/op
CharsTest.chars 100 avgt 30 0.726 ± 0.064 us/op
CharsTest.chars 10000 avgt 30 105.297 ± 0.285 us/op
CharsTest.chars 1000000 avgt 30 11077.694 ± 18.687 us/op
CharsTest.charsParallel 100 avgt 30 5.659 ± 0.077 us/op
CharsTest.charsParallel 10000 avgt 30 48.544 ± 1.357 us/op
CharsTest.charsParallel 1000000 avgt 30 4269.837 ± 19.214 us/op
CharsTest.range 100 avgt 30 1.428 ± 0.008 us/op
CharsTest.range 10000 avgt 30 180.103 ± 0.967 us/op
CharsTest.range 1000000 avgt 30 16711.417 ± 235.215 us/op
CharsTest.rangeParallel 100 avgt 30 5.848 ± 0.069 us/op
CharsTest.rangeParallel 10000 avgt 30 69.596 ± 0.708 us/op
CharsTest.rangeParallel 1000000 avgt 30 5621.781 ± 29.522 us/op
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment