Skip to content

Instantly share code, notes, and snippets.

@amaembo
Last active August 29, 2015 14:24
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/d4dce638197fe34987e3 to your computer and use it in GitHub Desktop.
Save amaembo/d4dce638197fe34987e3 to your computer and use it in GitHub Desktop.
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);
}
}
# 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