Last active
August 29, 2015 14:24
-
-
Save amaembo/d4dce638197fe34987e3 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
import java.util.*; | |
import java.util.stream.*; | |
import static java.util.stream.Collectors.*; | |
import java.util.concurrent.TimeUnit; | |
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 Limit { | |
@Param({"100", "10000", "1000000"}) | |
private int count; | |
@Benchmark | |
public void range(Blackhole bh) { | |
bh.consume(IntStream.range(0, count).mapToObj(i -> "?").collect(joining(","))); | |
} | |
@Benchmark | |
public void limit(Blackhole bh) { | |
bh.consume(Stream.generate(() -> "?").limit(count).collect(joining(","))); | |
} | |
@Benchmark | |
public void rangeParallel(Blackhole bh) { | |
bh.consume(IntStream.range(0, count).parallel().mapToObj(i -> "?").collect(joining(","))); | |
} | |
@Benchmark | |
public void rangeUnordered(Blackhole bh) { | |
bh.consume(IntStream.range(0, count).parallel().unordered().mapToObj(i -> "?").collect(joining(","))); | |
} | |
@Benchmark | |
public void limitParallel(Blackhole bh) { | |
bh.consume(Stream.generate(() -> "?").parallel().limit(count).collect(joining(","))); | |
} | |
@Benchmark | |
public void baseline(Blackhole bh) { | |
bh.consume(nCopies("?", ",", count)); | |
} | |
public static String nCopies(String symbol, String delimiter, int count) { | |
if(count <= 0) return ""; | |
char[] result = new char[(symbol.length()+delimiter.length())*count-delimiter.length()]; | |
fill(result, symbol, delimiter, count); | |
return new String(result); | |
} | |
private static void fill(char[] result, String symbol, String delimiter, int count) { | |
if(count == 1) { | |
symbol.getChars(0, symbol.length(), result, 0); | |
return; | |
} | |
int half = count/2; | |
int filled = (symbol.length()+delimiter.length())*half-delimiter.length(); | |
if(count % 2 == 0) { | |
fill(result, symbol, delimiter, half); | |
delimiter.getChars(0, delimiter.length(), result, filled); | |
System.arraycopy(result, 0, result, filled+delimiter.length(), filled); | |
return; | |
} | |
fill(result, symbol, delimiter, half); | |
int offset = filled; | |
delimiter.getChars(0, delimiter.length(), result, offset); | |
offset+=delimiter.length(); | |
symbol.getChars(0, symbol.length(), result, offset); | |
offset+=symbol.length(); | |
delimiter.getChars(0, delimiter.length(), result, offset); | |
offset+=delimiter.length(); | |
System.arraycopy(result, 0, result, offset, filled); | |
} | |
} |
This file contains hidden or 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
# JMH 1.9 (released 84 days ago) | |
# VM invoker: C:\Program Files\Java\jre1.8.0_40\bin\java.exe | |
Benchmark (count) Mode Cnt Score Error Units | |
Limit.baseline 100 avgt 30 0.259 ± 0.006 us/op | |
Limit.baseline 10000 avgt 30 16.664 ± 0.401 us/op | |
Limit.baseline 1000000 avgt 30 3086.832 ± 84.587 us/op | |
Limit.limit 100 avgt 30 2.484 ± 0.031 us/op | |
Limit.limit 10000 avgt 30 233.869 ± 3.366 us/op | |
Limit.limit 1000000 avgt 30 25773.914 ± 257.290 us/op | |
Limit.limitParallel 100 avgt 30 9.756 ± 0.265 us/op | |
Limit.limitParallel 10000 avgt 30 138.175 ± 4.616 us/op | |
Limit.limitParallel 1000000 avgt 30 15136.506 ± 302.854 us/op | |
Limit.range 100 avgt 30 2.447 ± 0.023 us/op | |
Limit.range 10000 avgt 30 243.458 ± 1.805 us/op | |
Limit.range 1000000 avgt 30 25977.646 ± 379.263 us/op | |
Limit.rangeParallel 100 avgt 30 10.110 ± 0.527 us/op | |
Limit.rangeParallel 10000 avgt 30 186.730 ± 28.947 us/op | |
Limit.rangeParallel 1000000 avgt 30 13758.669 ± 1174.138 us/op | |
Limit.rangeUnordered 100 avgt 30 11.269 ± 0.752 us/op | |
Limit.rangeUnordered 10000 avgt 30 160.336 ± 6.875 us/op | |
Limit.rangeUnordered 1000000 avgt 30 13066.599 ± 271.233 us/op |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment